首頁 >後端開發 >C++ >為什麼在C#Regex中的效率不如[0-9]'\ d`效率不高?

為什麼在C#Regex中的效率不如[0-9]'\ d`效率不高?

Barbara Streisand
Barbara Streisand原創
2025-01-31 18:41:08139瀏覽

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

C#正則表達式中d效率低於[0-9]:探究性能差異

最近一次性能比較意外地發現,在C#正則表達式引擎中,d字符類比[0-9]範圍指定符的效率低。通常情況下,範圍指定符的效率應該高於字符集。此外,即使與更冗長的[0123456789]字符集相比,d也表現出性能劣勢。

為了解釋這個令人驚訝的結果,讓我們深入探討一些可能的原因:

1. Unicode數字識別:

d表示所有Unicode數字,而不僅僅是[0-9]中指定的10個字符。 Unicode包含來自各種語言的其他數字字符,例如波斯數字(۱۲۳۴۵۶۷۸۹)。這種更廣泛的範圍可能會引入額外的計算開銷,從而降低d的效率。

為了說明這個概念,我們可以使用以下代碼生成所有Unicode數字的列表:

<code class="language-csharp">StringBuilder sb = new StringBuilder();
for (UInt16 i = 0; i < 0x10FFFF; i++)
{
    if (char.IsDigit((char)i))
    {
        sb.Append((char)i);
    }
}
string allUnicodeDigits = sb.ToString();</code>

這將生成一個包含以下字符(以及其他字符)的長字符串:

٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९০১২৩৪৫৬৭৮৯੦੧੨੩੪੫੬੭੮੯૦૧૨૩૪૫૬૭૮૯

2. 實現差異:

正則表達式引擎可能以不同的方式實現d[0-9],這可能會導致性能差異。 C#正則表達式引擎可能會專門優化[0-9]以提高效率,而d的更廣泛範圍可能會限制此類優化。

結論:

雖然最初令人驚訝,但d的性能較慢可以歸因於其對Unicode數字的擴展識別。當使用有限的數字集(例如0-9)時,[0-9][0123456789]可以提供更好的效率。但是,如果您需要匹配來自不同語言的更廣泛的數字字符範圍,d仍然是一個強大的工具。

以上是為什麼在C#Regex中的效率不如[0-9]'\ d`效率不高?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn