2014-02-26 56 views
0

是否有一个正则表达式来替换所有提到的字符串中的子字符串与除引号"'之外的另一个字符串?正则表达式得到子字符串外引号

例如,如果子是“你好”和替换字符串为“世界”:
Hello Everybody "Hello" Everybody应该返回World Everybody "Hello" Everybody

很抱歉的措辞早些时候,有一个brainfart。

+0

说whaaaat:''你好“世界”' – tenub

+0

'删除引号内的子字符串...是不是我想要的那么你想要什么? – sawa

+0

我只想忽略子字符串 – avinashbot

回答

1

你可以使用负回顾后和向前断言为"'这样,这将在

"apple hello world" 

失败:

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

工作正则表达式例如:

http://regex101.com/r/cR4zE6

匹配:

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

编辑:

所以在更换情况:

例字符串:Hello Everybody "Hello" Everybody

替换为:""(无)

输出:

Everybody "Hello" Everybody 
+0

即使(可以说)它是引用中的苹果和世界,这将不匹配'“苹果”你好“世界”。 –

+0

@DamienBlack,是的,OP不希望引号中的任何内容匹配。因此,“苹果”你好“世界”不匹配。 – MElliott

+0

但是'hello'没有引号。这是引用中的“苹果”和“世界”。这也不会匹配'你好“世界'',这里显然”世界“在引号中,而不是你好。 –

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

此正则表达式匹配“你好”仅当有偶数(包括0)的引号字符之前它(这表明它不是当前引号内)。

进行分解:

  • ^:开始在字符串的开头
  • (:开始可重复任意次数引号组
  • [^“] *:匹配报价之前的任何数量的非引号字符,任意文本
  • “:比赛开引号
  • [^”] *:匹配任意数量的非引号字符(这是在引号中的东西)
  • “:比赛结束引号
  • )*:结束报价组,重复任意数量的时间,包括0
  • [^”] *:你的话之前匹配任何额外的非引号字符,任意文本
  • 你好:你的话

与这里其他的答案,这将在下列情况下成功:

"apple"hello"world" 

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

而且因为hello仍然在引号

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"] 

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

+0

这不起作用,它在'hello'world''上失败它也成功应用在'test hello world''上,它不应该 –

+0

这个概念是有效的,我甚至解释了负面预测的概念,这是先进的正则表达式概念。它可以更新为包含其他字符。为什么downvote? – archie

+0

在我上面的评论''test hello world''上应该有另外一个引号' –

相关问题