1

\w- 代表[A-Za-z0-9_] 字符类

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

所以当我使用

[\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|"))

结果是真的,

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

4

2 回答 2

2

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

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

于 2019-06-13T02:02:00.917 回答
0

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

_-~匹配 _ (索引 95)和 ~ (索引 126)(区分大小写)之间范围内的单个字符,这就是T|获取匹配并返回的原因,true但是当您使用^[\w-~]+$它时,它不会形成任何匹配的字符范围_-~,因此它会失败并返回false

另请参阅^[A-Za-z0-9-~]+$返回false,因为它不包含在(index 95) 和(index 126)之间_建立范围的字符_-~_~

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

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

请参阅解释部分的https://regex101.com/r/vbLN9L/5 。

于 2019-06-13T02:13:27.513 回答