今天来搞一个基础知识,以往都是用的时候现想或网上找办法,这次记录一下:
在学习或者开发中经常会用到indexOf()方法,用来获取当前字符串中某个字符第一次出现的位置,有时候需要获取其出现第二、三、四、N次的位置,方法如下:
public static void main(String[] args) {
String text = "李蕾喜欢《超级玛丽》,韩梅梅喜欢《魂斗罗》,Sam喜欢《双截龙》";
Pattern pattern = Pattern.compile("《");
Matcher findMatcher = pattern.matcher(text);
while(findMatcher.find()) {
System.out.println(findMatcher.start());
}
}
运行结果:
封装一下,方便以后调用:
public static int getIndexOf (String data, String str, int num) {
Pattern pattern = Pattern.compile( str );
Matcher findMatcher = pattern.matcher( data );
//标记遍历字符串的位置
int indexNum = 0;
while ( findMatcher.find() ) {
indexNum++;
if( indexNum == num ){
break;
}
}
return findMatcher.start();
}
拓展一下:后续如果有要求:截取出来所有带《》的字符串怎么搞呢?(这里只是拿《》举个栗子)首先要知道《符号在字符串中出现了多少次,然后通过调用上面的方法,拿到每个《符号和每个》符号的起始位置(这里假设我们看到的文档都是健全的:《》这两个符号都带的,真遇到那种残疾文档,只有《没有》的那就想其他办法吧),然后用String.substring(《的开始位置, 》的开始位置 + 1);就可以拿到每个《》间的字符串,首先先get到《在字符串中出现的次数,下面有这么几个方法:
第一个:把要查找的字符用replace方法替换成空字符串,然后获取替换之前的字符串长度和替换之后的字符串长度,做减法就可以得出次数,这个方法比较简单就不贴代码了
第二个:
public static void main(String[] args) {
String text = "李蕾喜欢《超级玛丽》,韩梅梅喜欢《魂斗罗》,Sam喜欢《双截龙》";
String findText = "《";
int num = appearNumber(text, findText);
System.out.println(num);
}
public static int appearNumber(String srcText, String findText) {
int count = 0;
Pattern p = Pattern.compile(findText);
Matcher m = p.matcher(srcText);
while (m.find()) {
count++;
}
return count;
}
第三个:
public static void main(String[] args) {
String text = "李蕾喜欢《超级玛丽》,韩梅梅喜欢《魂斗罗》,Sam喜欢《双截龙》";
String findText = "《";
int num = strCount(text, findText);
System.out.println(num);
}
public static int strCount(String str, String findByStr){
String[] split = str.split("");
return Arrays.asList(split).stream().filter(s -> s.equals(findByStr)).collect(Collectors.toList()).size();
}
运行结果:都是一样的
然后就可以通过for循环,拿到每个《和》出现的起始位置,然后通过substring方法截取出想要的字符串,代码如下:
public static void main(String[] args) {
String text = "李蕾喜欢《超级玛丽》,韩梅梅喜欢《魂斗罗》,Sam喜欢《双截龙》";
String findText = "《";
int countBefore = strCount( text, "《");
for ( int j = 1; j <= countBefore; j++ ) {
int startJ = getIndexOf( text, "《", j );
int endJ = getIndexOf( text, "》", j );
System.out.println( text.substring( startJ, endJ + 1 ) );
}
}
调用的方法上面都已贴出,运行结果:
2021-7-16更新:
上面的方法由于后面实测,多多少少都会出现一些bug,数组越界或者正则匹配错误的情况,英文直接用substring截字符串,肯定会有一些突发的意外情况,所以我直接改用了用正则表达式去匹配特殊字符间的字符串,下面是代码:
public static void main(String[] args) {
//你要检索的字符串
String text = "xxx";
//正则表达式:这里是要匹配所有《》,这两个符号组合间的字符串
String regName = "\\《(.*?)\\》";
Pattern pattern = Pattern.compile(regName);
Matcher matcher = pattern.matcher(text);
while ( matcher.find() ){
System.out.println( matcher.group( 0 ));
}
}
运行结果和上面的是一样的~
参考链接:
java获取某个字符在指定字符串中出现的第N次的位置_sun_luming的博客-CSDN博客