往往有很多需求 , 需要取出指定字符之间的字符串 , 取的方式有多种 , 关系到重复使用的问题 , 如abc123abc456abc , 如果使用正则取出abc之间的内容 , 这里可能有两种结果 ,
结果1: 123 456
结果2: 123
为什么有两种结果呢
这里的一个区别就是 , abc能否重复使用的问题 , 结果1就是abc重复使用了 , 而结果2中取法 , abc不可重复使用
下面代码取出abc之间的内容
public static void main(String[] args) {/Pattern p = Pattern.compile("\@(.*?)\:");//正则表达式 , 取=和|之间的字符串 , 不包括=和|String filetext = "abc张小名abc 25分abc李小花abc 43分abc王力abc 100分abc";Pattern p = Pattern.compile("abc(.*?)abc");Matcher m = p.matcher(filetext);while(m.find()) {System.out.println(m.group());//m.group(1)不包括这两个字符}
结果为:
张小名
李小花
王力
很明显 , 上面的正则取法是不可重复的匹配法 , 每次匹配后 , abc不可下次使用
我们在改下代码
public static void main(String[] args) {String filetext = "abc张小名abc 25分abc李小花abc 43分abc王力abc 100分abc";//Pattern p = Pattern.compile("abc(.*?)abc");//正则表达式 会消耗字符串abcPattern p = Pattern.compile("(?<=abc)(.*?)(?=abc)");//不消耗字符串abcMatcher m = p.matcher(filetext);while(m.find()) {System.out.println(m.group(1));//m.group(1)不包括这两个字符} }
运行结果:
文章插图
这里我们可以看到 , 这种正则匹配是可以重复使用abc的 , 也就是指针没有下移 , 把abc之间的内容都娶到了
以上是两种正则的区别 , 需要根据实际场景来使用
关于正则表达式引擎 , 可以参考下图来学习
文章插图
文章插图
(?:pattern) 与 (?=pattern)也有一些区别 , 主要在于消耗字符、是否输出匹配结果方面 , 如下图已经说得很清楚了
文章插图
【java正则-取出指定字符串之间的内容】
推荐阅读
- 项目中不可忽视的JavaScript优化技巧
- Java程序员必须知道的Java10特性
- 收藏这36个正则表达式,开发效率提高80%
- java8中自带常用的函数式接口
- 在Java中使用Optional的开销很大 - pkolaczk
- Java 常用代码汇总
- 极简Redis使用
- 从字节码了解Java语言特性
- Java 实现5种负载均衡算法
- 学习Java需要掌握哪些技能?