Javascript 在字符类中如何解释单词字符?

Javascript 在字符类中如何解释单词字符?,javascript,regex,character-class,Javascript,Regex,Character Class,\w-代表[A-Za-z0-9.] 但我无法理解它是如何在角色类中被解释的 所以当我使用 [\w-~] let test=(str)=>/^[\w-~]+$/.test(str) log(test(“T |”)我认为两个示例之间的主要区别在于-字符的位置。在这个例子中发生的是: let test = (str) => /^[A-Za-z0-9_-~]+$/.test(str) console.log(test("T|")) 它被评估为一个范围,如下所示: let test = (st

\w
-代表
[A-Za-z0-9.]

但我无法理解它是如何在角色类中被解释的

所以当我使用

[\w-~]

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

log(test(“T |”)
我认为两个示例之间的主要区别在于-字符的位置。在这个例子中发生的是:

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

console.log(test("T|"))
它被评估为一个范围,如下所示:

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

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

console.log(test("T|"))
将返回true

其中,在本例中:

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

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

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

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

您可以通过将其移到末尾来避免这种情况,如下所示:

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

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

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

当你使用
^[A-Za-z0-9.-~]+$

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

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

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

log(test(“T |”)
在您的应用程序中,您使用了
^[\w-~]+$
,而我要求的是
^[\w-~]+$
mate@CodeManiac是,因为
^[\w-~]+$
被解释为
[A-Za-z0-9]
而不是
[A-Za-z0-9]
这就是为什么您必须在
\w
@CodeManiac之后添加额外的
\ucode>,但我可以在regex101.com上看到,他们说
\w匹配任何字母、数字或下划线。相当于[a-zA-Z0-9]。
@总是阳光明媚的,这个deo似乎不是案例伴侣,即使我没有使用
,它仍然会匹配
\Ucode>,所以
\w
不会被解释为
[a-zA-Z0-9]
@CodeManiac我想你是对的,我走的方向有点错,伙计:(@Emma它通过了,因为它在第二个表达式中创建了一个范围,而在第一个表达式中它没有,但我不理解为什么它在第一个表达式中没有创建一个范围,这似乎是完整和正确的。@WiktorStribiż新的推理在他的回答中是有意义的,但我仍然不明白引擎是如何将它们解释为不同的?我已经搜索了这一点,但我不知道dn对此没有任何参考或链接如果你只是想当然地认为正则表达式引擎会像其他解析器一样逐字符解析模式,这对你来说会更容易:当它找到反斜杠时,它会记住它,如果下一个字符是
w
,它知道这是一个word类速记。如果后面有连字符,它将被视为literal char,因为引擎知道前面的atom是一个速记类
,A-Z、A-Z和0-9被解析为范围,下划线和波浪线也是s范围,因为引擎逐字符读取模式。
\w
不是变量,也不是以任何方式“插值”。@WiktorStribiżew感谢您的时间伙伴:)感谢您的时间伙伴,任何要阅读的文档或链接,其中都声明了
,因为\w本身是一组字符,所以它正在评估字符本身。
?我没有任何关于这方面的信息,抱歉,是我个人使用regex的经验让我意识到这很可能是正在发生的事情,一个快速测试验证了这一点。