为什么 C# 中的 \d 比 [0-9] 慢?
大家好!我是一名 C# 初学者,在优化正则表达式时遇到了一个意想不到的问题。
我有一个任务:检查字符串是否只由数字组成。我写了两个正则表达式版本:
1. `^\d+$`
2. `^[0-9]+$`
直觉上,`\d` 应该更快或至少速度相同,因为它只是数字的缩写。但我用 `Stopwatch` 对长度为 1000 个字符(1000 个随机数字)的字符串进行了简单的基准测试,结果令人震惊:
```
\d: ~450 个 tick
[0-9]: ~120 个 tick
```
差距几乎达到 4 倍!而且我重复测试了 100 次以排除偶然性,结果稳定。
我使用的是 .NET 6,标准的 `Regex`,没有使用任何 flag。为什么会这样?`\d` 和 `[0-9]` 应该表示相同的东西——0 到 9 的数字。难道是我的测量方法有问题?或者 C# 中有一些关于 Unicode 的陷阱?
请告诉我原因以及如何正确编写用于匹配数字的正则表达式。