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