【问题标题】:using negative conditions within regular expressions在正则表达式中使用否定条件
【发布时间】:2011-09-05 01:14:03
【问题描述】:

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

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

我应该用什么代替@

【问题讨论】:

  • 您的问题不清楚。如果一个字符串以“hello”开头,它在哪里结束?我想你的意思不仅仅是字符串“hello”。
  • 对不起,我认为“以该模式开头的字符串”是指任何以该模式开头的字符串,但没有指定之后的内容......任何让它更清晰的建议,我会编辑记录在案。
  • 开头部分很清楚。不清楚的是,它在哪里结束。您只是对字符串“hello”或以“hello”开头并持续一定长度的字符串感兴趣吗?我以为你想要后者,如果是这样的话,NeX,s answser 将是合适的。如果您只想说“你好”,那么迈克尔的回答很好。
  • 我的意思是后者,尽管一个简单的“hello”(因为它后面没有“peter”)也应该匹配。也许我遗漏了一些东西,但除了空格位置之外,两个答案对我来说似乎都是正确的......迈克尔的答案为我捕获了任何长度和字数的字符串。
  • Michael 会进行某种查找,但会漏掉几个案例。 We are martians and we say 'hello peter' all the time 将匹配。 hello 单独不匹配。

标签: ruby regex gsub


【解决方案1】:

正如迈克尔告诉你的,你需要一个消极的前瞻。

你的例子是这样的:

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

这将在以下情况下替换:

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

并且会忽略以下内容:

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

【讨论】:

    【解决方案2】:

    听起来你想要一个否定的前瞻:

    >> "hello foo".gsub(/hello (?!peter)/, 'lala ') #=> "lala foo"
    >> "hello peter".gsub(/hello (?!peter)/, 'lala ') #=> "hello peter"
    

    【讨论】:

    • +1,消极的lookaheds不是那么直观。很高兴看到一个简单的例子。
    • 哦,是的,就是这样 :) 谢谢迈克尔!
    • 很好,又一次没有解释的反对票。如果您对答案有实际问题,为什么不提供反馈?
    • Michael,请参阅问题 cmets 中的 Nex 评论。一个小的修复就可以了。无论如何,它对我来说完全有用,谢谢!
    • dgilperez:我看到了评论,但我认为它不值得投反对票。无论如何,我们甚至不确定它是他的,只要你的问题得到回答,这最终并不重要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 2017-04-14
    • 1970-01-01
    • 2014-01-13
    相关资源
    最近更新 更多