\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|"))
结果为真
我无法理解这两个表达式有何不同?
答案 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_-~]+$
_-~
在_(索引95)和〜(索引126)(区分大小写)之间的范围内匹配单个字符,这就是T|
得到匹配并返回true
的原因,但是当您使用^[\w-~]+$
不会形成_-~
之类的字符的任何 range 匹配,因此它失败并返回false
请参见^[A-Za-z0-9-~]+$
还返回false
,因为它不包含_
字符以使_-~
(索引95)和{ {1}}(索引126)
_
请参见 EXPLANATION 部分上的https://regex101.com/r/vbLN9L/5。
答案 2 :(得分:0)