0

从 Chrome 控制台,我注意到了这个奇怪的地方:

/[^A-z]/.test("^")
false
/[A-z]/.test("^")
true

"^".charCodeAt(0)
94
"A".charCodeAt(0)
65
"z".charCodeAt(0)
122

/[a-zA-Z]/.test("^")
false

插入符号在 65-122 范围内匹配是有道理的,因为它的字符代码是 94,但我没有意识到 /[Az]/ 不等于 /[a-zA-Z]/。

所以我想我的问题是,javascript 是否将 ASCII 代码用于像 Az 这样的范围匹配?这是对这种行为的解释吗?

编辑:

经过进一步调查,这似乎是真的

String.fromCharCode(91)
"["
String.fromCharCode(92)
"\"
String.fromCharCode(93)
"]"
String.fromCharCode(94)
"^"
String.fromCharCode(95)
"_"
String.fromCharCode(96)
"`"

/[^A-z]/.test("^[\\_`")
false
4

3 回答 3

3

/[A-z]/range 表示从 65 到 122 的代码范围,其中也包括 94,即^

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

于 2013-10-23T16:06:12.327 回答
2

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

  1. a成为CharSet A中的一个字符。
  2. b为CharSet B中的一个字符。
  3. i为字符a代码单元值
  4. j为字符b代码单元值
  5. 如果i > j则抛出 SyntaxError 异常。
  6. 返回包含编号为ij的所有字符的集合,包括在内。

这里的短语“代码单元值”是一个 Unicode 术语。因此,该范围A-z包括其 Unicode 代码单元值介于 和 的代码单元值之间的所有字符,包括Az。此范围 ( 0x41- 0x7A) 确实包括六个非字母字符

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
于 2013-10-23T16:24:50.827 回答
0

请注意,在正则表达式中,插入符号表示新行的开始。如果您的意思是文字插入字符,则必须使用反斜杠对其进行转义。

但是,上面的 anubhava 的回答是您看到这种行为的原因。

于 2013-10-23T16:06:35.530 回答