我正在 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
之外的任何字符(可以是单字符或双字符quote - 字符串的分隔符)和 \\
(反斜杠字符)。
正则表达式正确地过滤掉了反斜杠并匹配了分隔符,但它没有过滤掉字符串中的分隔符。任何帮助将不胜感激。请注意,我提到了 Crockford 的 railroad diagrams编写正则表达式。
最佳答案
您不能在字符类中引用匹配的组:(['"])[^\1\\]
。请尝试这样的事情:
(['"])((?!\1|\\).|\\[bnfrt]|\\u[a-fA-F\d]{4}|\\\1)*\1
(您需要添加更多转义符,但您明白我的意思...)
快速解释:
(['"]) # match a single or double quote and store it in group 1
( # start group 2
(?!\1|\\). # if group 1 or a backslash isn't ahead, match any non-line break char
| # OR
\\[bnfrt] # match an escape sequence
| # OR
\\u[a-fA-F\d]{4} # match a Unicode escape
| # OR
\\\1 # match an escaped quote
)* # close group 2 and repeat it zero or more times
\1 # match whatever group 1 matched
关于javascript - 如何将这两个正则表达式合并为一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10356026/