Java——正则表达式搜索所有子串

需求

搜索字符串(下文称主串)中所有符合某正则表达式的子串,并得到所有子串的文字、位置、长度。

需求案例

一段长文字:头部123456@qq.com中间的文字吧啦吧啦balabala@sina.com.cn快结束了吧啦吧啦my_mail@163.com测试相同子串123456@qq.com,得到其中所有的邮箱。

难点

1、String类涉及正则表达式的常用方法中,包含匹配、分割、替换,难以实现需求;


String类涉及正则表达式的常用方法

2、主串中包含的符合条件的子串,可能文字完全相同,用 主串.indexOf(子串) 的方式,得不到正确索引。

难点解决思路

1、利用Pattern类(包:java.util.regex.Pattern)加Matcher类(包:java.util.regex.Matcher)实现搜索;
2、遍历过程中,每次搜索到结果后,截串,让 主串.indexOf(子串) 避开之前的串。

代码

String originalString = "头部123456@qq.com中间的文字吧啦吧啦balabala@sina.com.cn快结束了吧啦吧啦my_mail@163.com测试相同子串123456@qq.com";
String searchString = originalString;
String regexString = "[a-zA-Z0-9_]+@[0-9a-z]+(\\.[a-z]+)+";
Pattern datePattern = Pattern.compile(regexString);
Matcher dateMatcher = datePattern.matcher(searchString);
int beEndIndex = 0;
while(dateMatcher.find()) {   
      String subString = dateMatcher.group();
      System.out.print("子串:"+subString+"  "); 
      int subIndex = searchString.indexOf(subString);
      System.out.print("位置:"+(subIndex + beEndIndex)+"  ");
      int subLength = subString.length();
      System.out.println("长度:"+subLength);
      beEndIndex = subIndex + subLength + beEndIndex;
      searchString = originalString.substring(beEndIndex);
      dateMatcher = datePattern.matcher(searchString);
} 
System.out.println("end");

输出结果


输出结果

备注

1、为什么会有这种需求?
例如在安卓开发中,需要把这段文字中的所有类似"123456@qq.com"的邮箱地址换成"点击跳转"四个字,或者把主串中所有类似"www.baidu.com"的网址的文字颜色换成蓝色以达到看上去可以点击的效果;
2、欢迎指正、交流。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,546评论 19 139
  • 正则表达式描述的是一种规则,符合这种限定规则的字符串我们认为它某种满足条件的,是我们所需的。在正则表达式中,主要有...
    Single_YAM阅读 4,055评论 0 4
  • package com.fsti.icop.util.regexp; import java.util.regex...
    请叫我木头哥阅读 4,638评论 0 0
  • 概述 正则表达式通常用于两种功能:验证和搜索/替换。用于验证时,通常需要在前后分别加上^和$,以匹配整个待验证字符...
    陈晨_Fly阅读 3,785评论 1 5
  • 上一章小说连载《标准答案》4.29理想和内心相通 4.30太阳是大家的 两天没到办公室,林小米发现陈少铭送她的那盆...
    吴桐wutong阅读 1,794评论 0 1