javascript - 正则表达式 : backreferences inside []

标签 javascript regex

'"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/

相关文章:

javascript - Stilts.js 无法使用安全的 true 连接到 websocket 服务器

Javascript:动态创建正则表达式

java - 在 java string.replace 中使用正则表达式

java - 需要 RegEx 代码来删除邮政编码末尾的破折号,除非破折号后有数字

java - 我将如何使用正则表达式来允许某些字符?

删除字符串中的运行长度重复数字和 NA

javascript - 通过 JavaScript 调整 html 标签和 css 样式

javascript - 无法在 Jenkins 中生成脚本文件

javascript - 如何解决 JavaScript 中的正则表达式匹配/替换问题?

javascript - 循环中暂停和恢复 setTimeout