javascript - 如何将这两个正则表达式合并为一个?

标签 javascript regex

我正在 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/

相关文章:

javascript - 如何在 Backbone.Marionette View 中最轻松地呈现 i18n 文本和模型属性(使用 Handlebars 模板)

javascript - 在angularJS中使用工厂方法时未定义不是函数错误

javascript - jquery - 通过 AJAX 加载内联 javascript

javascript - 我正在尝试在 javascript 中创建选项卡式内容,但它只工作一次

javascript - 如何使用黑名单数组和正则表达式禁止带有变音符号的单词?

java - 路径中文件名的正则表达式 - macos

javascript - 为 Web Worker 使用不同的 output.libraryTarget

java - 使用正则表达式显示目录列表

regex - 为什么 `perl -i -p0e <expression>` 有效,但 `perl -0 -pie <expression>` 无效?

regex - 在 bash 脚本中使用正则表达式