'"aaa" "bbb"'.match(/("|')[^\1]+\1/g)
// ['"aaa" "bbb"']
'"aaa" "bbb"'.match(/("|')[^"]+\1/g)
// ['"aaa"', '"bbb"']
为什么 [^\1]+
而不是 [^"]+
使 RegExp 变得贪婪?
最佳答案
Why does
[^\1]+
instead of[^"]+
make RegExp greedy?
这不是你想象的那样。
首先,+
始终是最大匹配,即您所说的“贪婪”。它是+?
,它是最小匹配。
第二,也是更重要的一点,反向引用不会发生在方括号字符类中。您不小心只询问了除 Control-A 之外的任何字符。这是因为反斜杠后跟数字表示八进制表示法中的代码点,如 \177
中的 DELETE
ᴀᴋᴀ \x7F
或 \40
表示 SPACE ᴀᴋᴀ \x20
,或 \0
表示 NULL 。因此,当您编写 \1
时,您刚刚使用了 U+0001 或 \x01
。不要那样做。 :)
您可能想使用
(["'])(?:(?!\1).)+\1
相反。你需要 /s
模式,以便点可以匹配换行符,我似乎记得 Javascript 有一些搞砸的地方。
编辑:根据this ,笨拙的旧 JavaScript 无法使点匹配换行符。多么令人兴奋啊!当然,由于 Javascript 无法执行 Unicode 正则表达式,因此您无法使用 UTS#18’s RL1.2 所需的 \p{Any}
。
这意味着,如果引用的字符串中可能存在换行符,则必须使用一些蹩脚的拼凑,例如 [\S\s]
。
关于javascript - 正则表达式 : backreferences inside [],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7208117/