查找所有字符串文字的正则表达式

Regular expression to find all string literals

我正在使用 javascript 编写一个正则表达式,旨在以 javascript 中允许的所有排列捕获 javascript 代码中的字符串文字。这就是我想出的:

([\"\'])(.*?(?:(\"|\').*?.*?)*?)

说明:正则表达式捕获捕获组1中的起始引号("或'),并在表达式的末尾(\1)重复引号以包含完整的字符串文字。由于"body" 的字符串文字可以包含包含在转义引号中的子字符串(示例:"ab\"cd\"ef")我允许匹配的转义单引号和双引号出现在字符串文字文本中. 捕获组 3 用于匹配开始和结束的转义引号。 字符串文字的内容将位于捕获组 2 中,并删除了外部引号(用于括起字符串的标记将位于捕获组 1 中)。请注意,我使用 (?:..) 使其中一个组成为非捕获组。

我已经在下面的字符串上测试了表达式,它似乎可以工作:

"abcdefg"                  // Simple string literal using ".."
'abcdefg'                  // Simple string literal using '..'    
"a\"b\"c\"d\"e\'f\'g"      // Escaped matched singles and doubles
"a\"b\"\"c\"\'d\'\'e\'fg"  // Another variant
"\"ab\"\'cd\'ef\"\"\'\'g"  // Zero length escaped sequences
"a'b'cd'ef'g"              // Enclosed in doubles, singles in middle
'"ab"cd"e""f"g'            // Enclose in singles, doubles in middle

我的问题是,是否还有 javascript 中允许的任何其他排列我需要考虑。请注意,包含在双引号字符串文字 ("ab'cde'fg") 中的单引号序列和包含在单引号字符串文字 ('ab"cde"fg') 中的双引号序列不需要单独处理(我认为),因为该模式与封闭的外引号相匹配。如果有浏览器根本不支持正则表达式或不支持我在这里使用的功能(例如捕获组或非捕获语法),我也将感谢有关任何潜在的跨浏览器问题的反馈。

编辑:我正在尝试捕获嵌入字符串文字中的转义字符串文字。这使得这个问题陈述与 regex-for-quoted-string-with-escaping-quotes

中表达的不同

您接受三字母序列 "\" 作为字符串。 .* 过于包容,您还需要避免它匹配反斜杠。

也许(['"])(?:(?!(?:\|)).|\.)*:
匹配 ' 或 " 作为分隔符
然后匹配
的任意序列 - 非反斜杠、非定界符、非行终止符

- 反斜杠后跟任何非行终止符
然后再次匹配分隔符。

您仍然可能会被注释或 RegExp 文字中出现的定界符所打扰,fx

var m = /"/g.exec("a string"); // Matches a '"' char
//       ^^^^^^^^^^        ^^^^^^^^^^^^^^^^^^^ not strings!

所以它不是完美的查找 JavaScript 源中的所有字符串。为此,您实际上需要解析它。