【发布时间】: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