Java 防止非贪婪部件消耗以下可选部件
我有一个正则表达式,其中包含一个强制部分、一个非贪婪(懒惰?)部分、一个可选部分,最后是另一个非贪婪部分Java 防止非贪婪部件消耗以下可选部件,java,regex,non-greedy,Java,Regex,Non Greedy,我有一个正则表达式,其中包含一个强制部分、一个非贪婪(懒惰?)部分、一个可选部分,最后是另一个非贪婪部分 实现为: ^必需。*(:?可选部分).*.$ 可选部分包括“要查找的工件”和“要在捕获组中返回的工件” ^必选。*?(:?findme(matchme))?*?$ 但对于某些输入,第一个非贪婪部分使用的字符应该与下面的可选部分匹配。有没有办法使可选部分比以前的非贪婪部分更贪婪 示例:查找2,后面的字符,或者如果没有2,但必填部分匹配,则查找空字符串 "Foo: 2,b,1,a,3,c"
实现为:
^必需。*(:?可选部分).*.$
可选部分包括“要查找的工件”和“要在捕获组中返回的工件”
^必选。*?(:?findme(matchme))?*?$
但对于某些输入,第一个非贪婪部分使用的字符应该与下面的可选部分匹配。有没有办法使可选部分比以前的非贪婪部分更贪婪
示例:查找
2,
后面的字符,或者如果没有2,
但必填部分匹配,则查找空字符串
"Foo: 2,b,1,a,3,c" -> match, $1 = "b"
"Foo: 1,a,2,b,3,c" -> match, $1 = "b"
"Foo: 1,a,3,c,2,b" -> match, $1 = "b"
"Foo: 2,b" -> match, $1 = "b"
"Foo: 1,a,3,c" -> match, $1 = ""
"Fuu: 1,a,2,b,3,c" -> no match.
尝试1:^Foo:.*(?:2,([a-z]))?.*?$
在第2个和第3个示例中,此操作失败,返回的是
”
,而不是“2”
尝试2:^Foo:.*(?:2,([a-z])).*?$
这修复了前面的失败,但现在在第5个示例中失败,不匹配。
必须是可选的零件不再是可选的 如果重要的话,我正在使用Java的模式类 --
有人问了这个问题,但我们两人都没有满意的答案。您的第一个正则表达式非常接近,您需要将
(?:
移到左侧一点,以包含*?
模式:
^Foo:(?: .*?2,([a-z]))?.*$
^^^
见
详细信息
-字符串的开头^
-一些文字Foo:
-一个可选的非捕获组,可贪婪地匹配(将至少尝试一次)以下1或0个事件:(?:.*2,([a-z]))?
-空格后跟除换行符以外的任何0+字符,尽可能少*?
-文字子字符串2,
-第1组:小写字母([a-z])
-除换行符以外的任何0+字符(字符串的其余部分)*
-字符串结束$
^<MANADATORY_LITERAL>(?:<NON_GREEDY_DOT>(<OPTIONAL_PART>))?<GREEDY_DOT>$
^(?:())$
然后您添加了解释。因此可选组是贪婪的。在这种情况下,为什么它在我的尝试1中没有优先于前面的非贪婪部分?@MarkJeronimus Your^Foo:.*(?:2,([a-z])?。$
不起作用,因为在Foo:
与空格匹配后,*?
不匹配任何内容(空文本),然后(?:2,([a-z])?
不匹配任何内容(空文本)-请注意,如果此分组模式与字符串1一样紧跟空格,则它将匹配某些文本)-然后最后一个*?$
抓取整行。