基本上我需要的是一个正则表达式,它只选择未被单引号括起来的双引号。 (这是为了在不破坏任何嵌套字符串的情况下快速将双引号重构为单引号)。
示例(与here相同):
"foo" => 'foo'
'foo' => 'foo'
abc "foo" => abc 'foo'
foo "bar", "baz" => foo 'bar', 'baz'
abc 'foo "bar" baz' => abc 'foo "bar" baz'
所以在搜索这个问题时,我找到了how to do this in PCRE,但我无法弄清楚如何将(*SKIP)(*F)
转换为可用的Javascript Regex
我自己的Javascript尝试是:
/(?:('.*["].*')|")/g
(live demo)。
第一个模式/'.*["].*'/
可以很好地匹配我最终要排除的内容('foo "bar" baz'
),但我不确定如何告诉表达式,如果匹配,则排除它。
我尝试使用(?!)
表达式但没有成功。
如果有人知道如何写一个更好的正则表达式或者有一个替代解决方案来解决这个问题我会很感激。
编辑:
作为附加信息,正则表达式用于搜索和替换WebStorm / PHPStorm中的函数以重构源代码。
答案 0 :(得分:3)
您可以使用此正则表达式:
"(?=(?:[^']*'[^']*')*[^']*$)
它会匹配单引号之外的任何双引号,working sample。
诀窍是向前搜索一行单引号的行尾,如果找到奇数个单引号则不接受。
答案 1 :(得分:2)
除了评论:
<?php
$data = <<<DATA
"foo"
'foo'
abc "foo"
foo "bar", "baz"
abc 'foo "bar" baz'
DATA;
$regex = "~
'[^']*'(*SKIP)(*FAIL) # match everything between single quotes and fail
| # or
\"([^\"]*)\" # match double quotes
~x";
$data = preg_replace($regex, "'$1'", $data);
echo $data;
?>