非捕获组不贪心?

时间:2014-10-01 07:27:04

标签: regex

我想删除第一个

之后的所有内容

样品:

Yes – No – No – No
Yes – No – No & No – No
Yes Yes – No & No – No
Yes – No – No & No 
Yes – No
Yes – No – No

正在使用的正则表达式:

/(.+) (?:– .+)/

匹配度:

`Yes – No – No`
`Yes – No – No & No`
`Yes Yes – No & No`
`Yes – No`
`Yes`
`Yes – No`

似乎非捕获组是懒惰而不是贪婪?

我想要的结果是:

`Yes`
`Yes`
`Yes Yes`
`Yes`
`Yes`
`Yes`

4 个答案:

答案 0 :(得分:2)

(.+?) (?:– .+)

这会产生所需的结果。您的正则表达式(.+) (?:– .+)不正确,因为.+会在停止前尝试匹配尽可能多的字符,因此它会在最后-处停止。相反,请使用.+?使其变得懒惰。

http://regex101.com/r/hS3dT7/3

答案 1 :(得分:1)

实际上它是第一个(捕获)群体贪婪的问题。正则表达式引擎将首先尝试填充模式的最左边部分。尝试让第一组懒惰:

/(.+?) (?:– .+)/

另一方面,你真的不需要第二位的组,并且可以捕获到第一个-(前面有可选的空格)并完成它:

/^(.*?)\s*-/

或者,如果您不关心空白或者想要在之后修剪空间,那么它只是:

/^([^-]*)/

答案 2 :(得分:0)

使用以下正则表达式并删除匹配的字符串。

^[^–]*\K\s+–.*

DEMO

答案 3 :(得分:0)

另一个简单的解决方案,虽然不建议在生产代码中使用,因为如果字符串包含连续空格的长条纹但没有短划线,则可能会导致性能损失。 (当您编写[ \t]+$以删除尾随空格和制表符时,也会出现同样的问题。)

使用此正则表达式进行搜索(为清晰起见,添加了分隔符/):

/ *–.*/

用空字符串替换。

DEMO

这个想法非常简单。我们只搜索第一个破折号,可以在其前面加上空格,并将它们与之后的所有内容一起删除。