\d只匹配0-9的数字吗?

9
据我所知,\d 应该匹配非英语数字,例如 ۱۲۳۴۵۶۷۸۹۰,但是在 JavaScript 中它无法正常工作。
请参见此 jsFiddle:http://jsfiddle.net/xZpam/ 这是正常的行为吗?

1
这是正常的。问题在于你是否能够在JavaScript正则表达式中启用Unicode行为。Chrome不喜欢“u”标志。 - John Dvorak
1
https://dev59.com/OHVC5IYBdhLWcg3w51lv - Ravi Gadag
既然它只匹配[0-9],为什么不尝试使用^[۱۲۳۴۵۶۷۸۹۰]+$这样的表达式呢? - Menno
8个回答

11
似乎JavaScript不支持这个功能(正则表达式中的其他弱点也是如此)。但是有一个名为XRegExp的库,它有一个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>

编辑:

使用\p{Nd}代替\p{N},因为在非ECMA Script Regex引擎中,\d等效于\p{Nd}。感谢Shervin指出。另请参见Shervin的此fiddle


如果您想将输入限制为阿拉伯-印度东部阿拉伯-印度数字,则可以使用Unicode块标准:alert(XRegExp("^\\p{InArabic}\\p{N}").test('۱۲۳۴٤۵٥۶۷۸۹۰')); // True alert(XRegExp("^\\p{InArabic}\\p{N}").test('1234567890')); // False - Shervin
2
@Sina,我认为应该用\\p{Nd}(十进制数字)替换\\p{N}(数字),因为我们不想匹配非十进制数字字符如 ➋、⅑、Ⅷ等:http://jsfiddle.net/wZXZ3/2/ - Shervin
1
@Shervin 谢谢,我更新了答案,并链接到了你的fiddle。 - Sina Iravanian

10

2
补充一下Amber所说的,JavaScript使用ASCII表示\d和\w,但使用Unicode表示\s。来源 - Vimal Stan
是的,现在使用JS正则表达式进行良好的客户端验证确实有些麻烦。 - RusAlex
实际上,适当支持Unicode正则表达式匹配的编程语言往往是例外。 - R. Martinho Fernandes

3

2

\d 相当于 [0-9],根据 MDN 的说法。


1
Matches a digit character. Equivalent to [0-9].

For example, /\d/ or /[0-9]/ matches '2' in "B2 is the suite number."

来自 MDN


1

1

是的,\d 只匹配Ascii数字 09 是正常和正确的。权威参考资料是 ECMAScript标准。它并不特别容易阅读,但第15.10.2.12条(CharacterClassEscape)指定 \d 表示“包含数字0到9的十个字符集合”。


0

是的,在JavaScript中使用\d无法正确匹配非英语数字,但像JavaScript的其他奇怪部分一样,您仍然可以使用类似下面的代码检查非英语数字(例如波斯语数字):

/[۰, ۹]/.test("۱۲۳۴۵۶۷۸۹۰"); //true

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接