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

时间:2019-06-13 01:53:03

标签: javascript regex character-class

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

结果为真

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

range 在这里正在做所有事情

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

请参见^[A-Za-z0-9-~]+$还返回false,因为它不包含_字符以使_-~(索引95)和{ {1}}(索引126)

_

请参见 EXPLANATION 部分上的https://regex101.com/r/vbLN9L/5

答案 2 :(得分:0)

我想我找到了问题,这是因为范围:

^[A-Za-z0-9_~-]+$

该表达式不会通过,显然这个_-~是一个范围,它将从ASCII _中的此char传递到~,其中包括},{ {1}}和{

Demo 1

Demo 2