【发布时间】:2019-06-09 20:08:33
【问题描述】:
如果我在 Chrome 控制台中输入 /[\w-+]/,它会接受它。我得到了一个正则表达式对象,我可以像往常一样使用它来测试字符串。但是如果我输入/[\w-+]/u,它会显示VM112:1 Uncaught SyntaxError: Invalid regular expression: /[\w-+]/: Invalid character class。
在 Firefox 中,/[\w-+]/ 可以正常工作,但如果我在控制台中输入 /[\w-+]/u,它只会转到下一行,就好像我输入了一个不完整的语句一样。如果我试图通过运行eval('/[\w-+]/u') 强制它创建正则表达式,它会告诉我SyntaxError: invalid range in character class。
为什么u 标志会使正则表达式无效? MDN RegExp documentation 说 u 启用了一些 Unicode 功能,但我没有看到它如何影响字符类中的范围。
【问题讨论】:
-
u修饰符使正则表达式引擎以更严格的方式解析正则表达式。所有不必转义的字符都不能转义,而那些必须转义的字符。必须避免所有歧义。 -
好的,所以ECMA-262,第 570 页,注 3,说“
-字符可以按字面处理,也可以表示一个范围。如果它是第一个或ClassRanges的最后一个字符,范围规范的开始或结束限制,或紧跟范围规范"。 -
并且:ClassRanges 可以扩展为单个 ClassAtom 和/或由破折号分隔的两个 ClassAtom 的范围。在后一种情况下,ClassRanges 包括第一个 ClassAtom 和第二个 ClassAtom 之间的所有字符,包括在内; 如果 ClassAtom 不代表单个字符(例如,如果一个字符是
\w)或如果第一个 ClassAtom 的字符值大于第二个 ClassAtom 的字符值,则会发生错误。 (link) -
@WiktorStribiżew,您的引用似乎解释了为什么正则表达式会导致错误。但我没有看到任何关于为什么错误只发生在
u标志上的任何信息。 -
我希望 Mathias Bynens 能来分享他的想法。
标签: javascript regex unicode character-class