From this q/a https://stackoverflow.com/questions/2700953/a-regex-to-match-a-comma-that-isnt-surrounded-by-quotes,我推断匹配给定正则表达式的所有实例not引号内,是不可能的。也就是说,它不能匹配转义引号(例如:"this whole \"match\" should be taken"
)。如果有一种我不知道的方法可以解决我的问题。
但是,如果没有,我想知道是否有任何可以在 JavaScript 中使用的有效替代方案。我已经考虑了一下,但无法提供任何适用于大多数(如果不是全部)情况的优雅解决方案。
具体来说,我只需要使用 .split() 和 .replace() 方法的替代方法,但如果它可以更通用,那将是最好的。
例如:
输入字符串:
+bar+baz"not+or\"+or+\"this+"foo+bar+
将 + 替换为 #(不在引号内)将返回:
#bar#baz"not+or\"+or+\"this+"foo#bar#
实际上,您可以匹配不在任何字符串的引号内的正则表达式的所有实例,其中每个左引号再次闭合。比如说,如上面的示例所示,您想要匹配\+
.
这里的关键观察是,如果一个单词后面有偶数个引号,则该单词位于引号之外。这可以建模为前瞻断言:
\+(?=([^"]*"[^"]*")*[^"]*$)
现在,您不想计算转义引号。这变得有点复杂。代替[^"]*
,前进到下一个引用,您还需要考虑反斜杠并使用[^"\\]*
。到达反斜杠或引号后,如果遇到反斜杠,则需要忽略下一个字符,否则前进到下一个未转义的引号。看起来像(\\.|"([^"\\]*\\.)*[^"\\]*")
。结合起来,你到达
\+(?=([^"\\]*(\\.|"([^"\\]*\\.)*[^"\\]*"))*[^"]*$)
我承认这是一个little神秘的。 =)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)