在正则表达式中使用否定条件

6

在gsub表达式中使用负匹配是否可行? 我想替换以hello开头的字符串,除了hello Peter开头的字符串。

my-string.gsub(/^hello@/i, '')

我应该用什么代替@符号?


你的问题不够清晰。如果一个字符串以“hello”开头,它在哪里结束?我想你不是指仅仅是字符串“hello”。 - sawa
很抱歉,我认为“以...开头的字符串”意味着任何以该模式开头的字符串,而不指定其后面的内容...有什么建议可以使其更清晰,我会进行编辑以备记录。 - dgilperez
起始部分很清楚。不清楚的是它在哪里结束。你只是对字符串“hello”感兴趣,还是以“hello”开头并延续一段长度的字符串?我认为你想要后者,如果是这样,NeX的答案是合适的。如果你只想要“hello”,那么Michael的答案很好。 - sawa
我指的是后者,尽管一个简单的“hello”(因为它没有跟随“peter”)也应该匹配。也许我漏掉了什么,但除了空格位置外,两个答案对我来说都是正确的...迈克尔的答案对我来说可以捕获任意长度和任意数量的字符串。 - dgilperez
Michael的工作会有点好,但会错过一些情况。"我们是火星人,我们一直说 '你好Peter'"将匹配。而单独的“hello”则无法匹配。 - Roberto Decurnex
2个回答

7
听起来你需要一个负向先行断言:
>> "hello foo".gsub(/hello (?!peter)/, 'lala ') #=> "lala foo"
>> "hello peter".gsub(/hello (?!peter)/, 'lala ') #=> "hello peter"

+1,负向先行断言 不是那么直观。很高兴看到一个简单的例子。 - Emiliano Poggi
哦,是的,就是这样 :)谢谢你,Michael! - dgilperez
很好,又一个没有解释的负评。如果你对答案有实际问题,为什么不给予反馈呢? - Michael Kohl
迈克尔,请看问题评论中的Nex评论。只需要进行小修补即可。无论如何,这对我非常有用,谢谢! - dgilperez
dgilperez:我看到了评论,但我不认为它值得被踩。无论如何,我们甚至不确定那是他的评论,最终只要你的问题得到了回答就行了。 - Michael Kohl

2

正如Michael所说,你需要使用负向预查。

对于你的示例,类似于:

my_string.gsub(/^hello(?! peter)( .*|$)/i, '')

这将在以下情况下进行替换:

例如:

"hello"
"hello Mom"
"hello "
"hello Mom and Dad"

我会忽略这样的内容:

"hello Peter"
"hello peter"
"hellomom"
"hello peter and tom"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接