Javascript \d只匹配0-9个数字?
据我所知,Javascript \d只匹配0-9个数字?,javascript,regex,unicode,internationalization,Javascript,Regex,Unicode,Internationalization,据我所知,\d应该匹配非英语数字,例如,在JavaScript中不能正常工作 请参阅此JSFIDLE: 这是一种正常行为吗?JavaScript不支持Unicode正则表达式匹配(而且远远不是唯一一种这样的语言) 来自MDN的 匹配基本拉丁字母表中的数字字符。相当于 [0-9] 在Mozilla Firefox()的文档中,您会发现: \d Matches a digit character in the basic Latin alphabet. Equivalent to [0-9].
\d
应该匹配非英语数字,例如,在JavaScript中不能正常工作
请参阅此JSFIDLE:
这是一种正常行为吗?JavaScript不支持Unicode正则表达式匹配(而且远远不是唯一一种这样的语言)
来自MDN的
匹配基本拉丁字母表中的数字字符。相当于
[0-9]
在Mozilla Firefox()的文档中,您会发现:
\d
Matches a digit character in the basic Latin alphabet. Equivalent to [0-9].
\d
相当于[0-9]
,根据
从来看,JavaScript似乎不支持这一点(以及RegExp中语言的其他弱点)。但是,有一个名为的库具有unicode插件,它通过\p{}
类别定义启用unicode支持。例如,如果使用\p{Nd}
而不是\d
,它将匹配数字:
<script src="xregexp-all.js" type="text/javascript"></script>
<script type="text/javascript">
var englishDigits = '123123';
var nonEnglishDigits = '۱۲۳۱۲۳';
var digitsPattern = XRegExp('\\p{Nd}+');
if (digitsPattern.test(nonEnglishDigits)) {
alert('Non-english using xregexp');
}
if (digitsPattern.test(englishDigits)) {
alert('English using xregexp');
}
</script>
var englishDigits='123123';
var非英语数字=';
var digitsPattern=XRegExp('\\p{Nd}+');
if(数字模式测试(非英语数字)){
警报(“使用xregexp的非英语”);
}
if(数字模式测试(英语数字)){
警报(“使用xregexp的英语”);
}
编辑:
使用了\p{Nd}
而不是\p{N}
,因为\d
似乎等同于非ECMA脚本正则表达式引擎中的\p{Nd}
。谢谢你指出这一点。另请参见。是的,\d
仅匹配Ascii数字0
到9
,这是正常且正确的。权威参考文献是。阅读起来并不特别容易,但第15.10.2.12条(CharacterClassEscape)规定\d
表示“包含字符0到9的十个元素的字符集”。是的,使用\d
与JavaScript中的无英文数字不匹配,但是,与JavaScript的其他奇怪部分一样,您仍然可以使用如下代码在JavaScript中检查无英语数字(例如波斯语数字):
/[۰, ۹]/.test("۱۲۳۴۵۶۷۸۹۰"); //true
这是正常的。问题在于是否可以在javascript正则表达式中启用unicode行为。Chrome不喜欢u
标志。既然它只与[0-9]匹配,为什么不试试类似^[1777;۲۳۵۷۸۹ۺ]+$
的东西呢?除了Amber所说的之外,JavaScript对\d和\w使用ASCII,但对\s使用Unicode
。是的,现在用正确支持Unicode正则表达式匹配的JS regexpsLanguages进行良好的客户端验证是一个难题,实际上,这是一个例外。如果您想将输入限制为或使用Unicode块条件:alert(XRegExp(^\\p{InArabic}\\p{N})/True
警报(XRegExp(^\\p{InArabic}\\p{N}”).test('1234567890');//False
@Sina,我认为\\p{N}
(数字)应该替换为\\p{Nd}
(十进制数字),因为我们不想像这样匹配➋, ⅑, Ⅷ等:@Shervin谢谢,我更新了答案,并链接到你的小提琴。
/[۰, ۹]/.test("۱۲۳۴۵۶۷۸۹۰"); //true