9

据我所知,\d应该匹配非英文数字,​​例如,۱۲۳۴۵۶۷۸۹۰但它在 JavaScript 中不能正常工作。

看到这个jsFiddle:http: //jsfiddle.net/xZpam/

这是正常行为吗?

4

8 回答 8

11

JavaScript 似乎不支持这一点(以及 RegExp 语言的其他弱点)。但是有一个名为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}看起来\d等同\p{Nd}于非 ECMA 脚本正则表达式引擎。感谢Shervin指出这一点。另见Shervin的这个小提琴

于 2013-05-21T06:27:33.097 回答
10

JavaScript 不支持 Unicode 正则表达式匹配(它远非唯一支持这种匹配的语言)。

http://www.regular-expressions.info/unicode.html

于 2013-05-21T05:50:01.483 回答
3

在 Mozilla Firefox ( https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/RegExp ) 的文档中,您会发现:

\d  

Matches a digit character in the basic Latin alphabet. Equivalent to [0-9].
于 2013-05-21T05:51:40.383 回答
2

\d相当于[0-9],根据MDN

于 2013-05-21T05:51:50.403 回答
1

来自 MDN 。正则表达式测试

匹配基本拉丁字母表中的数字字符。相当于 [0-9]。

于 2013-05-21T05:51:20.177 回答
1
Matches a digit character. Equivalent to [0-9].

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

来自MDN

于 2013-05-21T06:05:00.303 回答
1

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

于 2013-05-21T06:49:24.287 回答
0

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

/[۰, ۹]/.test("۱۲۳۴۵۶۷۸۹۰"); //true
于 2018-03-06T10:53:33.943 回答