我想删除第一个–
样品:
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`
答案 0 :(得分:2)
(.+?) (?:– .+)
这会产生所需的结果。您的正则表达式(.+) (?:– .+)
不正确,因为.+
会在停止前尝试匹配尽可能多的字符,因此它会在最后-
处停止。相反,请使用.+?
使其变得懒惰。
答案 1 :(得分:1)
实际上它是第一个(捕获)群体贪婪的问题。正则表达式引擎将首先尝试填充模式的最左边部分。尝试让第一组懒惰:
/(.+?) (?:– .+)/
另一方面,你真的不需要第二位的组,并且可以捕获到第一个-
(前面有可选的空格)并完成它:
/^(.*?)\s*-/
或者,如果您不关心空白或者想要在之后修剪空间,那么它只是:
/^([^-]*)/
答案 2 :(得分:0)
答案 3 :(得分:0)
另一个简单的解决方案,虽然不建议在生产代码中使用,因为如果字符串包含连续空格的长条纹但没有短划线,则可能会导致性能损失。 (当您编写[ \t]+$
以删除尾随空格和制表符时,也会出现同样的问题。)
使用此正则表达式进行搜索(为清晰起见,添加了分隔符/
):
/ *–.*/
用空字符串替换。
这个想法非常简单。我们只搜索第一个破折号,可以在其前面加上空格,并将它们与之后的所有内容一起删除。