java正则-取出指定字符串之间的内容

往往有很多需求 , 需要取出指定字符之间的字符串 , 取的方式有多种 , 关系到重复使用的问题 , 如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)不包括这两个字符} }运行结果:
 

java正则-取出指定字符串之间的内容

文章插图
 
这里我们可以看到 , 这种正则匹配是可以重复使用abc的 , 也就是指针没有下移 , 把abc之间的内容都娶到了
以上是两种正则的区别 , 需要根据实际场景来使用
 
关于正则表达式引擎 , 可以参考下图来学习
 
java正则-取出指定字符串之间的内容

文章插图
 

java正则-取出指定字符串之间的内容

文章插图
 
(?:pattern) 与 (?=pattern)也有一些区别 , 主要在于消耗字符、是否输出匹配结果方面 , 如下图已经说得很清楚了
 
java正则-取出指定字符串之间的内容

文章插图
 

【java正则-取出指定字符串之间的内容】


    推荐阅读