据我所知,\d
应该匹配非英文数字,例如,۱۲۳۴۵۶۷۸۹۰
但它在 JavaScript 中不能正常工作。
看到这个jsFiddle:http: //jsfiddle.net/xZpam/
这是正常行为吗?
据我所知,\d
应该匹配非英文数字,例如,۱۲۳۴۵۶۷۸۹۰
但它在 JavaScript 中不能正常工作。
看到这个jsFiddle:http: //jsfiddle.net/xZpam/
这是正常行为吗?
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的这个小提琴。
JavaScript 不支持 Unicode 正则表达式匹配(它远非唯一支持这种匹配的语言)。
在 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].
\d
相当于[0-9]
,根据MDN。
来自 MDN 。正则表达式测试
匹配基本拉丁字母表中的数字字符。相当于 [0-9]。
Matches a digit character. Equivalent to [0-9].
For example, /\d/ or /[0-9]/ matches '2' in "B2 is the suite number."
来自MDN
是的,只匹配 Ascii 数字是正常和正确\d
的。权威参考是ECMAScript 标准。它不是特别容易阅读,但第 15.10.2.12 条(CharacterClassEscape)指定表示“包含字符 0 到 9(包括 0 到 9 在内)的十元素字符集”。0
9
\d
是的,在 JavaScript 中使用\d
不正确匹配 非英语数字,但就像 JavaScript 的其他奇怪部分一样,您仍然可以在 JavaScript 中检查非英语数字(例如波斯数字),使用如下代码:
/[۰, ۹]/.test("۱۲۳۴۵۶۷۸۹۰"); //true