【问题标题】:How word character is interpreted in character class?在字符类中如何解释单词字符?
【发布时间】:2019-10-27 13:38:30
【问题描述】:

\w - 代表[A-Za-z0-9_] Character class

但我无法理解它在字符类中是如何解释的。

所以当我使用

[\w-~]

let test = (str) => /^[\w-~]+$/.test(str)

console.log(test("T|"))

T| 失败

但是当我使用时

[A-Za-z0-9_-~]

let test = (str) => /^[A-Za-z0-9_-~]+$/.test(str)

console.log(test("T|"))

结果为真,

我无法理解这两种表达方式有何不同?

【问题讨论】:

  • @Emma 它在第二个表达式中创建一个范围时通过,而在第一个表达式中它没有,但我无法理解为什么它没有在第一个表达式中创建一个范围
  • Sebastien's answer 似乎完整且正确。
  • @WiktorStribiżew 的推理在他的回答中是有道理的,但我仍然不明白引擎如何将它们解释为不同的?我已经搜索过这个,但没有得到任何关于这个的参考或链接
  • 如果你想当然地认为正则表达式引擎会像任何其他解析器那样逐个字符地解析模式,这对你来说会更容易:当它找到一个反斜杠时,它会记住它,如果下一个字符是w,它知道它是一个单词类的简写。如果后面有连字符,则将其视为文字字符,因为引擎知道前一个原子是速记类。使用[A-Za-z0-9_-~],A-Z、a-z 和 0-9 被解析为范围,下划线和波浪号也是 s 范围,因为引擎逐个字符地读取模式。 \w 不是变量,也没有以任何方式“插值”。
  • @WiktorStribiżew 感谢您的时间 :)

标签: javascript regex character-class


【解决方案1】:

我相信您的两个示例之间的主要区别在于您的 - 角色的位置。这里发生的事情是在这个例子中:

let test = (str) => /^[A-Za-z0-9_-~]+$/.test(str)

console.log(test("T|"))

它被评估为一个范围,如下所示:

let test = (str) => /^[_-~]+$/.test(str)

console.log(test("|"))

将返回 true

在哪里:

let test = (str) => /^[\w-~]+$/.test(str)

console.log(test("T|"))

由于 \w 本身就是一组字符,因此它自己评估字符 -

- 的位置和它的周围环境会对它的解释产生巨大的影响。

您可以完全避免这种情况,方法是将其移至末尾,如下所示:

let test = (str) => /^[A-Za-z0-9_~-]+$/.test(str)

console.log(test("T|"))

这将返回 false

【讨论】:

  • 感谢您的时间伙伴,任何文件或链接可以阅读它声明Since \w is a set of characters in and of itself, it's evaluating the character - by itself. 的地方?
  • 我碰巧对此一无所知,抱歉,正则表达式的个人经验让我意识到这很可能是发生了什么,快速测试验证了它。
【解决方案2】:

当你使用^[A-Za-z0-9_-~]+$时,我猜范围在这里做所有事情@

_-~ 匹配 _(索引 95)和 ~(索引 126)(区分大小写)之间的单个字符,这就是为什么 T| 被匹配并返回 true 但是当你使用 ^[\w-~]+$ 它是没有形成任何 范围 的字符,例如 _-~ 以匹配,因此它失败并返回 false

请参阅 ^[A-Za-z0-9-~]+$ 也返回 false,因为它不包含 _ 字符以使 _-~ 介于 _(索引 95)和 ~(索引 126)之间

let test = (str) => /^[A-Za-z0-9-~]+$/.test(str)

console.log(test("T|"))

解释部分查看https://regex101.com/r/vbLN9L/5

【讨论】:

  • 在你的first link 中你使用了^[\w_-~]+$ 而我要求^[\w-~]+$ 这个伙伴
  • @CodeManiac 是的,因为^[\w-~]+$ 被解释为[A-Za-z0-9] 而不是[A-Za-z0-9_] 这就是为什么你必须在\w 之后包含额外的_ 的原因
  • @CodeManiac 但我可以在 regex101.com 上看到他们说的是\w Matches any letter, digit or underscore. Equivalent to [a-zA-Z0-9_].
  • @Alwayys Sunny 这个deosn似乎不是案例伙伴Demo,即使我不使用_,它仍然会匹配_,所以\w不会这样被解释为[A-Za-z0-9]
  • @CodeManiac 我认为你是对的,我的方向有点错误。 :(
猜你喜欢
  • 2020-01-19
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 2013-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多