替换未用单引号括起来的双引号

时间:2016-07-28 13:34:09

标签: regex pcre

我想用单引号替换双引号,如果它们没有使用PCRE包围单个引号。一些例子,意思是输入=>输出

"foo" => 'foo'
'foo' => 'foo'
abc "foo" => abc 'foo'
foo "bar", "baz" => foo 'bar', 'baz'
abc 'foo "bar" baz' => abc 'foo "bar" baz'

我使用修饰符^([^'"]*)"([^'"]*)"和' g`尝试了m multi-line。只要不超过一个" xyz"每行阻止(第4行失败)。

编辑:我忘了提到我目前的替换是$1'$2'

1 个答案:

答案 0 :(得分:3)

下方的解决方案仅适用于输入字符串没有转义序列的情况

/'[^']*'(*SKIP)(*F)|"/

请参阅regex demo

  • '[^']*' - 匹配单引号,0 +字符以外的单引号和单引号
  • (*SKIP)(*F) - PCRE动词序列丢弃匹配并从当前索引开始(您可以在How do (*SKIP) or (*F) work on regex? SO post上阅读更多内容)
  • | - 或......
  • " - 双引号。

如果存在转义序列,则需要编写解析器。