是否有正则表达式将字符串中子字符串的所有提及替换为引号"'
中的子字符串除外?
例如,如果子串是“Hello”并且替换的字符串是“World”:
Hello Everybody "Hello" Everybody
应该返回World Everybody "Hello" Everybody
对于之前的措辞感到抱歉,有一个脑筋。
答案 0 :(得分:1)
您可以对"
或'
使用负面的lookbehind和lookahead断言,如下所示:
(?<!["'])(Hello)(?!["'])
工作正则表达式示例:
匹配
"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'。
要打破它:
与此处的其他答案不同,这将在以下情况下成功:
"apple"hello"world"
因为apple
和world
在引号中,而不是你好。
这将失败
"apple hello world"
因为你好仍在引号