首页 >后端开发 >C++ >为什么在C#REGEX中匹配的数字匹配的效率不如\ d`效率'?

为什么在C#REGEX中匹配的数字匹配的效率不如\ d`效率'?

Barbara Streisand
Barbara Streisand原创
2025-01-31 18:26:09889浏览

Why is `d` Less Efficient Than `[0-9]` for Digit Matching in C# Regex?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn