我正在使用javascript编写正则表达式,旨在以javascript中允许的所有排列方式捕获javascript代码中的字符串文字。这就是我提出的:
([\"\'])(.*?(?:(\\"|\\').*?\3.*?)*?)\1
描述:正则表达式捕获捕获组1中的起始引号("或'),并在表达式的末尾(\ 1)重复引号以包含完整的字符串文字。由于"身体"字符串文字的字符串可以包含用转义引号括起来的子字符串(例如:" 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' fg")中,双引号序列包含在单引号字符串文字中(' ab" cde" fg')不需要单独处理(我认为),因为模式匹配封闭的外引号。我也很感激有关任何潜在的跨浏览器问题的反馈 - 如果有浏览器根本不支持正则表达式或者不支持我在这里使用的功能(例如捕获组或非捕获语法)
编辑:我试图捕获嵌入在字符串文字中的转义字符串文字。这使得此问题陈述与regex-for-quoted-string-with-escaping-quotes
中表达的不同答案 0 :(得分:1)
您接受三个字母的序列"\"
作为字符串。
.*
过于包容,您还需要避免匹配反斜杠。
也许(['"])(?:(?!(?:\\|\1)).|\\.)*\1
:
匹配'或"作为分隔符
然后匹配任何序列
- 非反斜杠,非分隔符,非行终止符字符
或
- 反斜杠后跟任何非行终止符字符
然后再次匹配分隔符。
您仍然可以通过注释或RegExp文字中出现的分隔符来抛弃它,因此它不适合查找JavaScript源代码中的所有字符串。为此你实际上需要解析它。