一尘不染

正则表达式以匹配所有不在引号内的实例

javascript

从这个问题,我推断出不可能匹配给定正则表达式的所有实例而不是引号。也就是说,它不能匹配转义的引号(例如:)"this whole \"match\" should betaken"。如果有我不知道的方法可以解决我的问题。

但是,如果没有,我想知道在JavaScript中是否可以使用任何有效的替代方法。我已经考虑了一下,但是无法提供任何适用于大多数(即使不是全部)情况的优雅解决方案。

具体来说,我只需要使用.split()和.replace()方法的替代方法,但是如果可以更广泛地推广,那将是最好的选择。

例如:
输入字符串:
+bar+baz"not+or\"+or+\"this+"foo+bar+
用#代替+,而不用引号引起来,将返回:
#bar#baz"not+or\"+or+\"this+"foo#bar#


阅读 897

收藏
2020-04-25

共1个答案

一尘不染

实际上,您可以匹配一个正则表达式的所有实例,而不是将它们匹配在任何字符串的引号内,因为每个字符串都被再次关闭。像上面的示例一样,您要匹配\+

此处的主要观察结果是,如果单词后面有偶数个引号,则该单词在引号之外。可以将其建模为先行断言:

\+(?=([^"]*"[^"]*")*[^"]*$)

现在,您不想计算转义引号。这变得更加复杂。[^"]*您需要同时考虑反斜杠并使用,而不是将其引至下一个引号[^"\\]*。到达反斜杠或引号后,如果遇到反斜杠,则需要忽略下一个字符,否则前进到下一个未转义的引号。看起来像(\\.|"([^"\\]*\\.)*[^"\\]*")。结合起来,您到达

\+(?=([^"\\]*(\\.|"([^"\\]*\\.)*[^"\\]*"))*[^"]*$)
2020-04-25