字符 class 中的单词字符如何解释?

How word character is interpreted in character class?

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

但我无法理解它在字符内部的解释方式 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|"))

结果为真,

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

我认为您的两个示例之间的主要区别在于您的 - 字符的位置。这里发生的是在这个例子中:

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

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

它被评估为一个范围,像这样:

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

console.log(test("|"))

将 return 正确.

这其中的位置:

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

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

由于 \w 本身就是一组字符,因此它正在评估字符 - 本身。

- 及其周围的位置会对其解释产生巨大影响。

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

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

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

这将 return false

我想当你使用 ^[A-Za-z0-9_-~]+$

时,range 正在做这里的所有事情

_-~ 匹配 _(索引 95)和 ~(索引 126)(区分大小写)之间范围内的单个字符,这就是为什么 T| 得到匹配而 returns true 但是当你使用 ^[\w-~]+$ 时,它不会形成任何 范围 的字符,如 _-~ 来匹配所以它失败并且 returns false

另请参见 ^[A-Za-z0-9-~]+$ returns false 因为它不包含 _ 字符以在 _ 之间形成范围 _-~ (索引 95)和 ~(索引 126)

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

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

参见https://regex101.com/r/vbLN9L/5此处的说明部分。