为什么正则表达式匹配 CJK Unified Ideographs Extension B unicode 20000-2A6DF 中的字母 s?
why regex match letter s in CJK Unified Ideographs Extension B unicode 20000-2A6DF?
基于这个例子What's the complete range for Chinese characters in Unicode?
字母"s"是否属于这个字母表?
var r = /[\u20000-\u2A6DF]/;
var t = 'sad';
console.log(t.match(r))
输出["s"]
为什么?
您的正则表达式包含 astral code points:
Astral code points are pretty easy to recognize: if you need more than 4 hexadecimal digits to represent the code point, it’s an astral code point.
这些代码点在 基本多语言平面 (BMP) 之外,可用于 JavaScript 正则表达式(例如 \u00XD
)。
但是,JavaScript 正则表达式引擎不支持 astral 代码点(对于当前的 ECMAScript 实现,它已经存在于 ECMAScript6 中,请参阅 Unicode code point escapes)。
因此,当 JavaScript 正则表达式引擎尝试解释正则表达式模式时,问题就出现了:它 "sees" \u2000
,然后 0
,然后 -
,然后 \u2A6D
,然后 F
在你的角色中 class。然后,引擎在0
和\u2A6D
(⩭
)之间创建了一个范围,这是一个非常大的字符量,实际上,所有的英文字母,还有更多可以匹配使用此正则表达式。
在 Javascript unicode string, chinese character but no punctuation post 中,您可以找到 JavaScript 的综合汉字正则表达式,其中包含中文中可能使用的 Unicode 代码点组合,但有几个里面有错别字。
这是一个工作片段:
var r = /(?:[\u4E00-\u9FCC\u3400-\u4DB5\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29]|[\ud840-\ud868][\udc00-\udfff]|\ud869[\udc00-\uded6\udf00-\udfff]|[\ud86a-\ud86c][\udc00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d])+/g;
var t = '我的中文不好。我是意大利人。你知道吗?';
console.log(t.match(r));
基于这个例子What's the complete range for Chinese characters in Unicode?
字母"s"是否属于这个字母表?
var r = /[\u20000-\u2A6DF]/;
var t = 'sad';
console.log(t.match(r))
输出["s"]
为什么?
您的正则表达式包含 astral code points:
Astral code points are pretty easy to recognize: if you need more than 4 hexadecimal digits to represent the code point, it’s an astral code point.
这些代码点在 基本多语言平面 (BMP) 之外,可用于 JavaScript 正则表达式(例如 \u00XD
)。
但是,JavaScript 正则表达式引擎不支持 astral 代码点(对于当前的 ECMAScript 实现,它已经存在于 ECMAScript6 中,请参阅 Unicode code point escapes)。
因此,当 JavaScript 正则表达式引擎尝试解释正则表达式模式时,问题就出现了:它 "sees" \u2000
,然后 0
,然后 -
,然后 \u2A6D
,然后 F
在你的角色中 class。然后,引擎在0
和\u2A6D
(⩭
)之间创建了一个范围,这是一个非常大的字符量,实际上,所有的英文字母,还有更多可以匹配使用此正则表达式。
在 Javascript unicode string, chinese character but no punctuation post 中,您可以找到 JavaScript 的综合汉字正则表达式,其中包含中文中可能使用的 Unicode 代码点组合,但有几个里面有错别字。
这是一个工作片段:
var r = /(?:[\u4E00-\u9FCC\u3400-\u4DB5\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29]|[\ud840-\ud868][\udc00-\udfff]|\ud869[\udc00-\uded6\udf00-\udfff]|[\ud86a-\ud86c][\udc00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d])+/g;
var t = '我的中文不好。我是意大利人。你知道吗?';
console.log(t.match(r));