JAVA正则表达式精通之路2

Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n
X{n,} X,至少 n
X{n,m} X,至少 n 次,但是不超过 m
 
Reluctant 数量词
X?? X,一次或一次也没有
X*? X,零次或多次
X+? X,一次或多次
X{n}? X,恰好 n
X{n,}? X,至少 n
X{n,m}? X,至少 n 次,但是不超过 m
 
Possessive 数量词
X?+ X,一次或一次也没有
X*+ X,零次或多次
X++ X,一次或多次
X{n}+ X,恰好 n
X{n,}+ X,至少 n
X{n,m}+ X,至少 n 次,但是不超过 m

Greedy:贪婪的

 Pattern p = Pattern.compile("\\d{3,5}");
          String s = "123753re";
          Matcher m = p.matcher(s);
          System.out.println(m.find());
          System.out.println(m.group());

返回12375

Reluctant:勉强的

     Pattern p = Pattern.compile("\\d{3,5}?");
          String s = "123753re";
          Matcher m = p.matcher(s);
          System.out.println(m.find());
          System.out.println(m.group());

返回123

Possessive:占有的

 Pattern p = Pattern.compile("\\d{3,5}+");
          String s = "123753re";
          Matcher m = p.matcher(s);
          System.out.println(m.find());
          System.out.println(m.group());

返回的是12375,从结果可以看出来占用模式也是贪婪的,按照多的来,下文资料显示,占用模式是一种提供运行效率的做法

数量表示符

"数量表示符(quantifier)"的作用是定义模式应该匹配多少个字符。
  • Greedy(贪婪的): 除非另有表示,否则数量表示符都是greedy的。Greedy的表达式会一直匹配下去,直到匹配不下去为止。(如果发现表达式匹配的结果与预期的不符),很有可能是因为它是greedy的,因此会一直匹配下去。
  • Reluctant(勉强的): 用问号表示,它会匹配最少的字符。也称为lazy, minimal matching, non-greedy, 或ungreedy。
  • Possessive(占有的): 目前只有Java支持。它更加先进,所以你可能还不太会用。用正则表达式匹配字符串的时候会产生很多中间状态,(一般的匹配引擎会保存这种中间状态,)这样匹配失败的时候就能原路返回了。占有型的表达式不保存这种中间状态,因此也就不会回头重来了。它能防止正则表达式的失控,同时也能提高运行的效率。

你可能感兴趣的:(JAVA正则表达式精通之路2)