这是“Javascript:The Good Parts”一书中的正则表达式
//Make a regular expression object that matches a javascript string.
var my_regexp = new RegExp("\"(?:\\\\.|[^\\\\\\\"])*\"", 'g');
这个[^\\\\\\\"]
表达式在这里匹配什么?
这是“Javascript:The Good Parts”一书中的正则表达式
//Make a regular expression object that matches a javascript string.
var my_regexp = new RegExp("\"(?:\\\\.|[^\\\\\\\"])*\"", 'g');
这个[^\\\\\\\"]
表达式在这里匹配什么?
在 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"
.
如果我们也想支持'
,那么事情会变得非常复杂,我们可能应该只使用简单的逐字符解析器,而不是正则表达式。
展开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"
\