Javascript 正则表达式字符范围 A-z 匹配插入符号 (“^”)
Javascript Regular Expressions Character Range A-z Matches Caret ("^")
在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,但我没有意识到/[A-z]/不等同于/[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
ECMAScript 15.10.2.15 处理正则表达式计算期间基于范围的字符集的生成。在构建从字符A
到字符B
的范围(即A-B
):
- 让 a 成为字符集 A 中的一个角色。
- 设 b 是字符集 B 中的一个字符。
- 设 i 是字符 a 的代码单位值。
- 设 j 为字符 b 的代码单位值。
- 如果我>j,则抛出语法错误异常。
- 返回包含编号为 i 到 j 的所有字符(包括 i 到 j)的集合。
这里的短语"代码单位值"是一个 Unicode 术语。因此,范围A-z
包括其 Unicode 代码单元值介于 A
和 z
之间的所有字符(包括 和 )。此范围(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
/[A-z]/
范围表示代码范围从 65 到 122,这也包括 94,这是^
这就是/[A-z]/
匹配^
或[
或]
或_
等的原因。
请注意,在正则表达式中,插入符号表示新行的开头。如果您指的是文字插入符号字符,则必须使用反斜杠对其进行转义。
但是,anubhava上面的答案是您看到这种行为的原因。
相关文章:
- 插入符号到底是什么
- 将插入符号位置移动到ContentEditable<DIV>
- 为更改的输入返回插入符号位置的逻辑
- 内容可编辑DIV单击/插入符号设置
- 在contentEditable元素中居中占位符插入符号
- 获取插入符号相对于行可见起点的位置
- JavaScript 插入符号位置
- 链接内的内容可编辑块,如何防止重定向,但让文本选择插入符号位置更改
- 如何更改文本区域中闪烁的光标/插入符号
- Caret函数没有'如果插入符号在最后一个位置,就不能正常工作
- TinyMCE微笑符号插件-更改插入的微笑符号的宽度
- 如何使用javascript获取&使用字符偏移量设置插入符号位置
- text使用shift键和箭头键时的区域插入符号位置
- Rangy和IE8-在段落末尾的元素后面放置插入符号
- HTML Texeare 插入符号控件使用左、右、下、上、主页和结束虚拟按钮
- 在插入符号位置获取DOM元素
- 单击时获取文本区域中插入符号的位置
- 正则表达式替换为插入符号
- 隐藏插入符号-插入点-输入栏-闪烁的垂直小栏
- 我如何检测一个表情符号插入事件从OS X字符查看器和iOS表情符号键盘在Javascript/Redactor