Regex 如何选择性地捕获正则表达式值?

Regex 如何选择性地捕获正则表达式值?,regex,Regex,我知道以前有人问过这个问题。 但我似乎找不到解决办法: 下面是测试字符串 value: value1, Do not include this value: value2 这是我的正则表达式:值:(.*)(?:,不包括此)? 结果应该是 value1 value2 但它却抓住了这一点 value1, Do not include this value2 [编辑] 根据评论和回答。 让我澄清一下 如果这是测试字符串 value: value1, Do not include this val

我知道以前有人问过这个问题。 但我似乎找不到解决办法:

下面是测试字符串

value: value1, Do not include this
value: value2
这是我的正则表达式:
值:(.*)(?:,不包括此)?

结果应该是

value1
value2
但它却抓住了这一点

value1, Do not include this
value2
[编辑] 根据评论和回答。 让我澄清一下

如果这是测试字符串

value: value1, Do not include this
value: value1, test,
value: man, this is bad!!, Do not include this
那么捕获的值应该是:

value1
value1, test, test,
man, this is bad!!
值:(.*)(?:,不包括此项)?
---- ~~~~~~~~~~~~~~~~~~~~~~~~
A B
表达式的问题是,允许A部分匹配整行,而B部分是可选的。正则表达式引擎在遇到A时,将直接跳到它当前匹配的行的末尾,并在途中使用所有字符。然后,在匹配了A之后,它将前进到表达式的B部分,查看它是否无法匹配(因为整行已被使用)并且它是可选的,并且,这是表达式的结尾,停止此尝试并声明匹配成功

防止这种情况发生的一种方法是使部分变为惰性,同时通过使用行结束锚点强制表达式匹配整行。例如:

值:(.*)(:,不包括此)$

您还可以使A部分和B部分彼此非常不同,这样您就不必担心一个匹配替代另一个。如果适用,这将允许您保留A部分的贪婪量词。例如:

值:([^,]*)(?:,不包括此)?

哪种方式更适合您的需要取决于您匹配的字符串的组成。

value:([^,]+)
如果测试字符串=
value:man,这是坏的!!,不包括此
则您必须在其后面添加可选组
值:([^,]+)(?:,不包括此)?
或者如果这是它后面唯一允许的内容
值:([^,]+)(?:,不包括此|$)
我已更新了问题。看起来你的答案(以及评论的人)在第一次评论时就停止了。@FlowUI.SimpleUITesting.com我添加了一个到演示的链接。很高兴它成功了。我认为,更重要的部分是解释为什么你的表达方式没有达到你想要的效果。我希望这部分是可以理解的;我不擅长写作^^