从这个问题,我推断出不可能匹配给定正则表达式的所有实例而不是引号。也就是说,它不能匹配转义的引号(例如:)"this whole \"match\" should betaken"。如果有我不知道的方法可以解决我的问题。
"this whole \"match\" should betaken"
但是,如果没有,我想知道在JavaScript中是否可以使用任何有效的替代方法。我已经考虑了一下,但是无法提供任何适用于大多数(即使不是全部)情况的优雅解决方案。
具体来说,我只需要使用.split()和.replace()方法的替代方法,但是如果可以更广泛地推广,那将是最好的选择。
例如: 输入字符串: +bar+baz"not+or\"+or+\"this+"foo+bar+ 用#代替+,而不用引号引起来,将返回: #bar#baz"not+or\"+or+\"this+"foo#bar#
+bar+baz"not+or\"+or+\"this+"foo+bar+
#bar#baz"not+or\"+or+\"this+"foo#bar#
实际上,您可以匹配一个正则表达式的所有实例,而不是将它们匹配在任何字符串的引号内,因为每个字符串都被再次关闭。像上面的示例一样,您要匹配\+。
\+
此处的主要观察结果是,如果单词后面有偶数个引号,则该单词在引号之外。可以将其建模为先行断言:
\+(?=([^"]*"[^"]*")*[^"]*$)
现在,您不想计算转义引号。这变得更加复杂。[^"]*您需要同时考虑反斜杠并使用,而不是将其引至下一个引号[^"\\]*。到达反斜杠或引号后,如果遇到反斜杠,则需要忽略下一个字符,否则前进到下一个未转义的引号。看起来像(\\.|"([^"\\]*\\.)*[^"\\]*")。结合起来,您到达
[^"]*
[^"\\]*
(\\.|"([^"\\]*\\.)*[^"\\]*")
\+(?=([^"\\]*(\\.|"([^"\\]*\\.)*[^"\\]*"))*[^"]*$)