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:
    -一些文字
  • (?:.*2,([a-z]))?
    -一个可选的非捕获组,可贪婪地匹配(将至少尝试一次)以下1或0个事件:
    • *?
      -空格后跟除换行符以外的任何0+字符,尽可能少
    • 2,
      -文字子字符串
    • ([a-z])
      -第1组:小写字母
  • *
    -除换行符以外的任何0+字符(字符串的其余部分)
  • $
    -字符串结束
一般模式如下所示

^<MANADATORY_LITERAL>(?:<NON_GREEDY_DOT>(<OPTIONAL_PART>))?<GREEDY_DOT>$
^(?:())$

然后您添加了解释。因此可选组是贪婪的。在这种情况下,为什么它在我的尝试1中没有优先于前面的非贪婪部分?@MarkJeronimus Your
^Foo:.*(?:2,([a-z])?。$
不起作用,因为在
Foo:
与空格匹配后,
*?
不匹配任何内容(空文本),然后
(?:2,([a-z])?
不匹配任何内容(空文本)-请注意,如果此分组模式与字符串1一样紧跟空格,则它将匹配某些文本)-然后最后一个
*?$
抓取整行。