查找所有字符串文字的正则表达式
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 源中的所有字符串。为此,您实际上需要解析它。
我正在使用 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 源中的所有字符串。为此,您实际上需要解析它。