C#正则表达式中d
效率低于[0-9]
的原因
最近的性能测试表明,在C#正则表达式引擎中,用于匹配数字的d
的效率出人意料地低于[0-9]
和[0123456789]
字符集。这一发现引发了两个问题:
1. 为什么范围[0-9]
比集合[0123456789]
效率更高?
人们可能会认为范围的实现效率更高,因为它涵盖了特定且狭窄的字符范围,而集合则明确列出了所有十个数字。然而,测试结果表明,这两种方法之间的性能差异最小。
2. 为什么d
的效率低于[0-9]
?
测试发现d
的效率明显低于[0-9]
。这尤其令人费解,因为d
通常被认为是[0-9]
的简写。进一步调查揭示了一个根本区别:
d
匹配Unicode数字,[0-9]
匹配ASCII数字
与只匹配ASCII数字(0-9)的[0-9]
不同,d
匹配所有Unicode数字。这包括来自其他语言和字符集的字符,例如波斯数字(۱۲۳۴۵۶۷۸۹)和德瓦那加里数字(०१२३४५६७८९)。为了证明这一点,以下代码生成一个包含所有Unicode数字的字符串:
<code class="language-csharp">var sb = new StringBuilder(); for (UInt16 i = 0; i < 0x10FFFF; i++) { if (char.IsDigit((char)i)) { sb.Append((char)i); } } string unicodeDigits = sb.ToString();</code>
生成的字符串显示了d
识别为数字的各种字符,包括来自阿拉伯语、泰语、高棉语和其他文字的字符。
性能影响
检查更广泛的字符范围(Unicode数字与ASCII数字)解释了d
和[0-9]
之间的性能差异。在只需要匹配ASCII数字的情况下,使用[0-9]
将比d
产生更好的性能。
以上是为什么在C#REGEX中匹配的数字匹配的效率不如\ d`效率'?的详细内容。更多信息请关注PHP中文网其他相关文章!