0

这是“Javascript:The Good Parts”一书中的正则表达式

//Make a regular expression object that matches a javascript string.
var my_regexp = new RegExp("\"(?:\\\\.|[^\\\\\\\"])*\"", 'g');

这个[^\\\\\\\"]表达式在这里匹配什么?

4

2 回答 2

3

在 JavaScript 中,字符串由"(或',此正则表达式不支持)包围,\用于转义原本具有不同含义的字符。

现在,[^\\\\\\\"]是非\或字符的字符类"。然而,因为我们使用字符串文字来定义"需要转义的正则表达式,并且因为\在字符串和正则表达式中都有特殊含义,所以我们也需要对它们进行转义。

\"        starting characters
\\"       escape `\` for regex
\\\"      escape `"` for regex
\\\\\\"   escape `\` for string
\\\\\\\"  escape `"` for string

如果您使用'字符串或正则表达式文字,它会更简单。以下都是一样的。

new RegExp("\"(?:\\.|[^\\\\\\\"])*\"", "g");
new RegExp('"(?:\\.|[^\\\\\\"])*"', 'g');
/"(?:\.|[^\\\"])*"/g

实际上,"在正则表达式中没有特殊含义,因此没有必要对其进行转义。

/"(?:\.|[^\\"])*"/g

另请注意,.不是\or ",因此该|构造毫无意义。我猜这是一个错误,它的本意是\\.- 即 a\后跟任何字符。那将需要\原始文件中的四个,而不是两个。如果没有这个更正,表达式将不会匹配像"ab\\c".

如果我们也想支持',那么事情会变得非常复杂,我们可能应该只使用简单的逐字符解析器,而不是正则表达式。

正则表达式参考

于 2013-08-08T10:53:08.623 回答
1

展开var my_regexp = new RegExp("\"(?:\\.|[^\\\\\\\"])*\"",'g');

1: new RegExp("\"(?:\\.|[^\\\\\\\"])*\"",'g');
2: /"(?:\.|[^\\\"])*"/g
               ^--- this backslash is not really needed, but does not hurt

匹配",后跟任意数量的.or not\和 not ",后跟". 此外,由于该组有(?:...)- 它实际上不会捕获任何东西,它只会检查这种模式是否存在。

例如,在字符串I "li.ke" donuts. I "h\ate" potatoes.中它将匹配,但由于."li.ke"而不会匹配。"h\ate"\

于 2013-08-08T10:36:15.797 回答