java获取某个字符在字符串中出现第N次的位置

今天来搞一个基础知识,以往都是用的时候现想或网上找办法,这次记录一下:

在学习或者开发中经常会用到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博客

https://www.jb51.net/article/130237.htm

用java实现在一个字符串中查找某个子字符串出现的次数 - 那心之所向 - 博客园

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值