我知道之前已经问过这个问题。但我似乎找不到解决方案:
这里是测试字符串
value: value1, Do not include this
value: value2
这里是我的正则表达式:value: (.*)(?:, Do not include this)?
结果应捕获
value1
value2
但是它捕获了这个
value1, Do not include this
value2
[EDIT]基于评论和答案。让我澄清一下。
如果这是测试字符串
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!!
value: (.*)(?:, Do not include this)?
---- ~~~~~~~~~~~~~~~~~~~~~~~~
A B
表达式的问题是,允许A部分与整行匹配,而B部分是可选的。遇到A时,正则表达式引擎将简单地跳至当前匹配的行的末尾,并消耗该途中的所有字符。然后,在匹配了A之后,它将前进到表达式的B部分,看到它无法匹配(因为整行已经被占用)并且它是可选的,并且这是表达式的结尾,请停止尝试并声明匹配成功。防止这种情况发生的一种方法是,使A部分变得懒惰,同时通过使用行尾锚来强制表达式与整行匹配。例如:
value: (.*?)(?:, Do not include this)?$
请参见demo。您还可以使A和B部分彼此区分开,以致您不必担心一个匹配项会替代另一个。如果适用,这将使您可以保留A部分的贪婪量词。例如:
value: ([^,]*)(?:, Do not include this)?
哪种方式更适合您的需要取决于匹配的字符串的组成。