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

问题描述 投票:0回答:1

我知道之前已经问过这个问题。但我似乎找不到解决方案:

这里是测试字符串

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!!
regex nsregularexpression
1个回答
1
投票
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)?

哪种方式更适合您的需要取决于匹配的字符串的组成。
© www.soinside.com 2019 - 2024. All rights reserved.