这是“Javascript:The Good Parts”一书中的正则表达式
//Make a regular expression object that matches a javascript string.
var my_regexp = new RegExp("\"(?:\\\\.|[^\\\\\\\"])*\"", 'g');
这个[^\\\\\\\"]
表达式在这里匹配了什么?
答案 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解析器,而不是正则表达式。
答案 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"
而不匹配\
。