我正在使用JavaScript编写基本的词法分析器,并使用正则表达式。我有两个正则表达式(一个用于单引号字符串,一个用于双引号字符串),希望将它们合并为一个正则表达式。这是我的两个正则表达式(我添加了^
和$
字符进行测试):
var singleQuotedString = /^'(?:[^'\\]|\\'|\\\\|\\\/|\\b|\\f|\\n|\\r|\\t|\\u[0-9A-F]{4})*'$/gi;
var doubleQuotedString = /^"(?:[^"\\]|\\"|\\\\|\\\/|\\b|\\f|\\n|\\r|\\t|\\u[0-9A-F]{4})*"$/gi;
现在,我尝试将它们组合成一个正则表达式,如下:
var string = /^(["'])(?:[^\1\\]|\\\1|\\\\|\\\/|\\b|\\f|\\n|\\r|\\t|\\u[0-9A-F]{4})*\1$/gi;
但是,当我测试输入
"Hello"World!"
时,它返回true
而不是false
:alert(string.test('"Hello"World!"')); //should return false as a double quoted string must escape double quote characters
我发现问题在于
[^\1\\]
应该匹配除匹配组\1
(这是字符串的定界符,可以是单引号或双引号)和\\
(这是反斜杠字符)之外的任何字符。
正则表达式正确地过滤了反斜杠并匹配了定界符,但它没有过滤掉字符串中的定界符。非常感谢您的帮助。请注意,我参考了 Crockford 的铁路图来编写这些正则表达式。
(?!\1|\\).
这样做。在 MDN 上说,'x(?!y)'
只匹配 'x',当且仅当 'x' 后面不跟着 'y'。 - Aadit M Shah(?!)
和(?=)
始终指向当前位置右侧的内容。除非它没有匹配成功,否则左侧的内容无关紧要,因为您不会在这个断言上。 - user557597