替换Javascript正则表达式中未被单引号包围的双引号

替换Javascript正则表达式中未被单引号包围的双引号,javascript,regex,Javascript,Regex,基本上我需要的是一个正则表达式,它只选择不被单引号包围的双引号。(这是为了在不中断任何嵌套字符串的情况下快速将双引号重构为单引号) 示例(与相同): 因此,在搜索这个问题时,我能够找到,但我无法找到如何将(*SKIP)(*F)转换为可用的Javascript正则表达式 我自己的Javascript尝试是: /(?:('.['.].')|“)/g() 第一个模式/'.[“].*/很好地匹配了我最终想要排除的内容('foo“bar”baz'),但我不确定如何告诉表达式,如果匹配,就排除它 我尝试过使

基本上我需要的是一个正则表达式,它只选择不被单引号包围的双引号。(这是为了在不中断任何嵌套字符串的情况下快速将双引号重构为单引号)

示例(与相同):

因此,在搜索这个问题时,我能够找到,但我无法找到如何将
(*SKIP)(*F)
转换为可用的Javascript正则表达式

我自己的Javascript尝试是:
/(?:('.['.].')|“)/g
()

第一个模式
/'.[“].*/
很好地匹配了我最终想要排除的内容(
'foo“bar”baz'
),但我不确定如何告诉表达式,如果匹配,就排除它

我尝试过使用
(?!)
表达式,但没有成功

如果有人对如何编写更好的正则表达式有想法,或者对这个问题有其他解决方案,我将不胜感激

编辑:


作为补充信息,正则表达式用于WebStorm/PHPStorm中的搜索和替换函数,以重构源代码。

除了注释:

<?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;
?>

您可以使用此正则表达式:

"(?=(?:[^']*'[^']*')*[^']*$)
它将匹配单引号之外的任何双引号


诀窍是向前搜索一对单引号,直到行尾,如果找到奇数个单引号,则不要接受。

如果使用所述的
(*跳过)(*失败),这将容易得多
机制。是的,它会!不幸的是,它在该程序中不是有效的正则表达式。你不能在有问题的代码上运行一个脚本吗?这可以归结为大约五行,真的。如果这不是一个选项,请查看并向下滚动到
JS
部分-但即使这样,也需要一个完整的JavaScript功能
PHPStorm
可能没有(未测试)。简,事实上这是一个好主意。你对此有什么建议(软件/脚本)?嗯,问题是问JavaScript,而不是PHP代码?@Bergi:当然,你是对的,但是请阅读评论部分。感谢你把这篇文章放在一起,Jan,我很感激。这真的很好,考拉——谢谢你的解释。这篇文章是否也很容易扩展,也可以排除里面有单引号的双引号?是的,是的gex
“([^'\n]+)”(?=(?:[^']*'[^']*')*[^']*$)
但现在它将匹配整个文本并捕获内容,因此您需要用
“$1”替换它
"(?=(?:[^']*'[^']*')*[^']*$)