java正则表达式找不到最长匹配

ste*_*lee 2 java regex

为什么java(使用Matcher.find())找不到最长的匹配?

regex = "ab*(bc)?"
Run Code Online (Sandbox Code Playgroud)

输入"abbbc"时,正则表达式找到"abbb",而不是"abbbc",它也匹配并且更长.有没有办法强制它匹配最长的字符串?

小智 5

(bc)是一个精确的字符串,因为b*是贪婪的,所以没有找到它,但是(bc)?
是最后一个'b'之后超过的匹配是可选的.你可能想要这样的东西:ab*[bc]?但这种情况很有意义ab*c?.如果这个正则表达式代表更精细的东西,你应该发布这些例子.

以下是正则表达式引擎的看法:

Compiling REx "ab*(bc)?"
Matching REx "ab*(bc)?" against "abbbc"
   0 <> <abbbc>              |  1:EXACT <a>(3)
   1 <a> <bbbc>              |  3:STAR(6)
                                  EXACT <b> can match 3 times out of 2147483647...
   4 <abbb> <c>              |  6:  CURLYM[1] {0,1}(16)
   4 <abbb> <c>              | 10:    EXACT <bc>(14)
                                      failed...
                                    CURLYM trying tail with matches=0...
   4 <abbb> <c>              | 16:    END(0)
Match successful!

Compiling REx "ab*[bc]?"
Matching REx "ab*[bc]?" against "abbbc"
   0 <> <abbbc>              |  1:EXACT <a>(3)
   1 <a> <bbbc>              |  3:STAR(6)
                                  EXACT <b> can match 3 times out of 2147483647...
   4 <abbb> <c>              |  6:  CURLY {0,1}(19)
                                    ANYOF[bc] can match 1 times out of 1...
   5 <abbbc> <>              | 19:    END(0)
Match successful!
Run Code Online (Sandbox Code Playgroud)