RegExp中的混淆不情愿的量词?Java的

Dus*_*usk 2 java regex

为什么我ab使用Relucutant量词获得以下正则表达式代码的输出?

    Pattern p = Pattern.compile("abc*?");
    Matcher m = p.matcher("abcfoo");
    while(m.find())
      System.out.println(m.group()); // ab
Run Code Online (Sandbox Code Playgroud)

同样,为什么我得到以下代码的空索引?

   Pattern p = Pattern.compile(".*?");
   Matcher m = p.matcher("abcfoo");
   while(m.find())
     System.out.println(m.group());
Run Code Online (Sandbox Code Playgroud)

Tom*_*lak 7

除了Konrad Rudolph的回答:

abc*?
Run Code Online (Sandbox Code Playgroud)

匹配"ab"在任何情况下,并"c"只有当它必须.由于没有任何内容*?,正则表达式引擎立即停止.如果你有:

abc*?f
Run Code Online (Sandbox Code Playgroud)

那么它会匹配"abcf"是因为"c"必须匹配才能允许"f"匹配.另一个表达方式:

.*?
Run Code Online (Sandbox Code Playgroud)

没有匹配,因为这种模式是100%可选的.

.*?f
Run Code Online (Sandbox Code Playgroud)

"abcf"再次匹配.


Kon*_*lph 5

*?匹配零个或多个匹配,但尽可能少(顺便说一下,通常称为"非贪婪",而不是"不情愿").因此,如果零匹配是可能的,那就是最佳匹配.

你到底想要达到什么目的?也许非贪婪的匹配不是你需要的.

  • 我认为"不情愿"对他们来说是最好的词,尽管"非贪婪"也是好的.但"懒惰"(另一种最常见的描述符)是误导IMO; 他们实际上比贪婪或占有量词更加努力. (3认同)
  • Java确实称它为"不情愿".http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html (2认同)