Javascript正则表达式字符范围A-z匹配插入符号(“^”)

时间:2013-10-23 16:04:16

标签: javascript regex

在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

3 个答案:

答案 0 :(得分:3)

/[A-z]/范围表示代码范围为65到122,其中包括94 ^

这就是/[A-z]/^[]_等匹配的原因。

答案 1 :(得分:2)

ECMAScript 15.10.2.15在正则表达式求值期间处理基于范围的字符集的生成。在构建从字符A到字符B(即A-B)的范围时:

  
      
  1. a 成为 CharSet A 中的一个字符。
  2.   
  3. b 成为 CharSet B 中的一个字符。
  4.   
  5. i 成为 a 代码单元值
  6.   
  7. j 为字符 b 代码单位值
  8.   
  9. 如果 i &gt; j 然后抛出一个SyntaxError异常。
  10.   
  11. 返回包含编号 i j 的所有字符的集合。
  12.   

这里的短语“代码单元值”is a Unicode term。因此,范围A-z包括Unicode代码单元值落在Az的代码单元值之间的所有字符。此范围(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上面的回答是你看到这种行为的原因。