今天先看了下java正在表达式中的的非捕获,有些绕,所以把理解写下来。
详细解释见代码注释
import java.util.regex.Matcher; import java.util.regex.Pattern;
public class TestRegexNonCapoture { public static void main(String[] args) { String s1 = "12345a678"; Pattern p = Pattern.compile("//d{2,5}a|a//d{4}"); Matcher m = p.matcher(s1); while(m.find()){ // 只有一次结果,//d{2,5}a // a11:12345a p("a11:"+m.group()); } // 3个数字后边跟着的是a p = Pattern.compile("//d{2,5}(?=a)|a//d{1,4}"); m = p.matcher(s1); while(m.find()){ // /d{2,5}(?=a) 先匹配到组合12345a // 因为要lookahead,所以end()向前挪一个字符,最终得到的是12345 // 如果是//d{2,5}(?=aa)会挪两个字符 // a22:12345 // a22:a6790 p("a22:"+m.group()); }
String s2 = "12345a67a899"; p = Pattern.compile("(?<=a)//w{5}"); m = p.matcher(s2); while(m.find()){ // p("a33:"+m.group()); }
p = Pattern.compile("//w{5}(?<=a)"); m = p.matcher(s2); while(m.find()){ // //w{5}(?<=a) 匹配到组合12345a,因为要lookbehind,所以start()向后挪一个字符,得到2345a p("a44:"+m.group()); } } static void p(Object o){ System.out.println(o); } }
|