据我所知,
请参见此 jsFiddle:http://jsfiddle.net/xZpam/ 这是正常的行为吗?
\d
应该匹配非英语数字,例如 ۱۲۳۴۵۶۷۸۹۰
,但是在 JavaScript 中它无法正常工作。请参见此 jsFiddle:http://jsfiddle.net/xZpam/ 这是正常的行为吗?
\d
应该匹配非英语数字,例如 ۱۲۳۴۵۶۷۸۹۰
,但是在 JavaScript 中它无法正常工作。\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。
alert(XRegExp("^\\p{InArabic}\\p{N}").test('۱۲۳۴٤۵٥۶۷۸۹۰')); // True
alert(XRegExp("^\\p{InArabic}\\p{N}").test('1234567890')); // False
- Shervin\\p{Nd}
(十进制数字)替换\\p{N}
(数字),因为我们不想匹配非十进制数字字符如 ➋、⅑、Ⅷ等:http://jsfiddle.net/wZXZ3/2/ - ShervinJavaScript不支持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].
Matches a digit character. Equivalent to [0-9].
For example, /\d/ or /[0-9]/ matches '2' in "B2 is the suite number."
来自 MDN
是的,\d
只匹配Ascii数字 0
到 9
是正常和正确的。权威参考资料是 ECMAScript标准。它并不特别容易阅读,但第15.10.2.12条(CharacterClassEscape)指定 \d
表示“包含数字0到9的十个字符集合”。
是的,在JavaScript中使用\d
无法正确匹配非英语数字,但像JavaScript的其他奇怪部分一样,您仍然可以使用类似下面的代码检查非英语数字(例如波斯语数字):
/[۰, ۹]/.test("۱۲۳۴۵۶۷۸۹۰"); //true
^[۱۲۳۴۵۶۷۸۹۰]+$
这样的表达式呢? - Menno