正则表达式获取引号外的子字符串

时间:2014-02-26 16:19:32

标签: ruby regex

是否有正则表达式将字符串中子字符串的所有提及替换为引号"'中的子字符串除外?

例如,如果子串是“Hello”并且替换的字符串是“World”:
Hello Everybody "Hello" Everybody应该返回World Everybody "Hello" Everybody

对于之前的措辞感到抱歉,有一个脑筋。

3 个答案:

答案 0 :(得分:1)

您可以对"'使用负面的lookbehind和lookahead断言,如下所示:

(?<!["'])(Hello)(?!["'])

工作正则表达式示例:

http://regex101.com/r/cR4zE6

匹配

"Hello" world  //no match
Hello World  //matches "Hello"

修改

所以在替换情况下:

示例字符串:Hello Everybody "Hello" Everybody

替换为:""(无)

输出:

Everybody "Hello" Everybody

答案 1 :(得分:0)

使用负前瞻和负后瞻断言。这很有效。

irb(main):050:0> testcases = ["hello world", "'hello world", "'hello' world", "hello' world", "hello\"world"]
=> ["hello world", "'hello world", "'hello' world", "hello' world", "hello\"world"]
irb(main):051:0> testcases.each { |i| puts /(?<!')(?<!")hello(?!")(?!')/.match(i) }
hello




=> ["hello world", "'hello world", "'hello' world", "hello' world", "hello\"world"]

编辑:更新为包含双引号,但可以扩展为任何字符。

答案 2 :(得分:-1)

^([^"]*"[^"]*")*[^"]*hello

只有当前面有一个偶数(包括0)的引号字符(表示它当前不在引号内)时,此正则表达式才会匹配'hello'。

要打破它:

  • ^:从字符串的开头
  • 开始
  • (:启动可重复任意次数的引号组
  • [^“] *:匹配任意数量的非引号字符,用于引号之前的任意文字
  • “:匹配开场报价
  • [^“] *:匹配任意数量的非引号字符(这是引号中的内容)
  • “:匹配结束报价
  • )*:结束引号组并重复任意数量的时间,包括0
  • [^“] *:匹配任何其他非引号字符,用于单词
  • 之前的任意文字
  • 你好:你的话

与此处的其他答案不同,这将在以下情况下成功:

"apple"hello"world"

因为appleworld在引号中,而不是你好。

这将失败

"apple hello world"

因为你好仍在引号