制作与Javascript字符串匹配的Regex对象。解释方法

时间:2013-08-08 10:28:38

标签: javascript regex

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

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

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

事实上,"在正则表达式中没有特殊含义,因此无需转义它。

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

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

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

RegExp Reference

答案 1 :(得分:1)

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

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

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

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