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中文網其他相關文章!