gpt4 book ai didi

javascript - 为什么/[\w-+]/是有效的正则表达式,但/[\w-+]/u 无效?

转载 作者:行者123 更新时间:2023-11-28 12:13:54 27 4
gpt4 key购买 nike

如果我输入 /[\w-+]/在 Chrome 控制台中,它接受它。我得到一个正则表达式对象,可以像往常一样用来测试字符串。但如果我输入 /[\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 documentationu启用一些 Unicode 功能,但我没有看到任何关于它如何影响字符类范围的信息。

最佳答案

RegExp character set内,一个hyphen-minus字符(标准键盘破折号)表示它分隔的两个字符之间的字符代码范围。异常(exception)情况是它被转义 ( \- ) 或它不分隔两个字符,因为它是类的最后一个字符或第一个字符(在反转类的可选插入符号之后)。

字符范围的三个示例:一个简单示例、一个高级示例和一个错误:

  • [a-z]非常简单,因为它按照我们期望的方式工作,尽管这实际上是因为字符代码碰巧是连续的。另一种写法是[\x61-\x7a]
  • [!-~]一点也不简单,至少在您查看字符映射表并了解到 ! 之前是这样。是第一个可打印的 ASCII 字符且 ~是最后一个(“低位 ASCII”),因此这是“所有可打印的低位 ASCII 字符”的一种说法,它相当于 [\x21-\x7e]
  • [A-z]里面有一个开关盒。您可能不喜欢这个范围接受六个非字母字符(即 [\x41-\x7a] )

ASCII Table

<小时/>

现在让我们检查一下 /[\w-+]/u 的正则表达式Regex101 有一个信息更丰富的错误:“您无法使用速记转义序列创建范围”

\w本身不是一个字符(而是字符的集合),相邻的破折号必须按字面意思理解,否则就是错误。当您使用 /u 调用它时flag触发fullUnicode ,您进入更严格的模式,因此会收到错误。

我从 "foo".match(/[\w-+]/u) 得到的错误在 Firefox 64.0 中是:

SyntaxError: character class escape cannot be used in class range in regular expression

这比您得到的错误信息稍微丰富一些,因为它实际上告诉您问题出在转义上(尽管不是为什么会出现问题)。

根据ECMAScript 2015's RegExBuiltinExec() logic :

  1. If fullUnicode is true, then
    1. e is an index into the Input character list, derived from S, matched by matcher. Let eUTF be the smallest index into S that corresponds to the character at element e of Input. If e is greater than or equal to the length of Input, then eUTF is the number of code units in S.
    2. Let e be eUTF.

这似乎是明确构建自己的范围解析逻辑。

<小时/>

解决方案是要么转义连字符减号,要么将其放在最后(或第一个):

/[\w\-+]/u/[\w+-]/u/[-\w+]/u 。我个人总是把它放在最后。

关于javascript - 为什么/[\w-+]/是有效的正则表达式,但/[\w-+]/u 无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54205197/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com