Javascript正则表达式不以某些特殊字符结尾但返回true。

3

console.log(/^[0-9a-zA-Z]+[~!@#$%^&*_+-=]+$/.test("123456"));

我认为应该返回false,因为该字符串不以~!@#$%^&*_+-=字符结尾,但在运行时它返回了true。为什么会返回true

1
你有什么问题? - tblznbits
1
为什么字符串“123456”与正则表达式“/^[0-9a-zA-Z]+[!@#$%^&*_+-=]+$/”匹配?它没有一个或多个字符在[!@#$%^&* _ + - =]中。 - iinux
1个回答

6
问题在于+-=是一个范围。如果您查看ASCII表,您会发现+-=包括+-./:;<=和所有数字0 .. 9
您需要的是[~!@#$%^&*_+\-=](转义-)。

你打败了我几秒钟 :) - Toto
你有没有任何参考资料可以解释RegExp使用基于ASCII表顺序的范围? - Dez
非常感谢,您快速解决了我的问题。这个问题困扰我很长时间了。 - iinux
1
@Dez http://www.ecma-international.org/ecma-262/8.0/index.html#sec-runtime-semantics-characterrange-abstract-operation 表示范围 a-b 基于字符 ab 的“字符值”。http://www.ecma-international.org/ecma-262/8.0/index.html#sec-ecmascript-language-types-string-type 表明字符串基本上使用 UCS-2,即范围在 0 到 127 的字符值与 ASCII 匹配(0 到 255 匹配 ISO 8859-1(Latin-1))。 - melpomene
这是一个好的建议。我差点推荐使用[^\d\w]$。很高兴知道+ - =实际上是一个范围。+1 - JBone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接