在Chrome控制台中,我注意到这种奇怪之处:</ p>
/[^A-z]/.test("^")
false
/[A-z]/.test("^")
true
"^".charCodeAt(0)
94
"A".charCodeAt(0)
65
"z".charCodeAt(0)
122
/[a-zA-Z]/.test("^")
false
因为它的字符代码是94,所以插入符号在65-122范围内匹配是有意义的,但我没有意识到/ [Az] /不等于/ [a-zA-Z] /。
所以我想我的问题是,javascript是否使用ASCII代码进行远程匹配,如A-z?这是对这种行为的解释吗?
编辑:
经过进一步调查后,这似乎是真的
String.fromCharCode(91)
"["
String.fromCharCode(92)
"\"
String.fromCharCode(93)
"]"
String.fromCharCode(94)
"^"
String.fromCharCode(95)
"_"
String.fromCharCode(96)
"`"
/[^A-z]/.test("^[\\_`")
false
答案 0 :(得分:3)
/[A-z]/
范围表示代码范围为65到122,其中包括94 ^
这就是/[A-z]/
与^
或[
或]
或_
等匹配的原因。
答案 1 :(得分:2)
ECMAScript 15.10.2.15在正则表达式求值期间处理基于范围的字符集的生成。在构建从字符A
到字符B
(即A-B
)的范围时:
- 让 a 成为 CharSet A 中的一个字符。
- 让 b 成为 CharSet B 中的一个字符。
- 让 i 成为 a 的代码单元值。
- 让 j 为字符 b 的代码单位值。
- 如果 i &gt; j 然后抛出一个SyntaxError异常。
- 返回包含编号 i 至 j 的所有字符的集合。
醇>
这里的短语“代码单元值”is a Unicode term。因此,范围A-z
包括Unicode代码单元值落在A
和z
的代码单元值之间的所有字符。此范围(0x41
- 0x7A
)包括six non-alphabetic characters:
U+005B [ 5b LEFT SQUARE BRACKET
U+005C \ 5c REVERSE SOLIDUS
U+005D ] 5d RIGHT SQUARE BRACKET
U+005E ^ 5e CIRCUMFLEX ACCENT
U+005F _ 5f LOW LINE
U+0060 ` 60 GRAVE ACCENT
答案 2 :(得分:0)
请注意,在正则表达式中,插入符号表示新行的开头。如果你的意思是字面符号字符,你必须使用反斜杠来逃避它。
然而,anubhava上面的回答是你看到这种行为的原因。