如果我基于以下模式创建Regex
:@"[A-Za-z]+"
,如果我已经在使用RegOptions.IgnoreCase
(由于issues like this导致),则通过添加RegOptions.CultureInvariant
来匹配它的匹配集吗?我认为这是显而易见的“不,它只是多余和重复的”。在我的测试中,这就是我所显示的,但是我想知道是否由于确认偏差而丢失了某些内容。
如果我在这一点上错了,请纠正我,但是我相信我确实需要使用CultureInvariant
,因为我也不知道这种文化是什么。 MSDN Reference
注意:这不是我需要使用的实际模式,只是其中最简单的关键部分。完整的模式是:@"[A-Za-z0-9\s!\\#$(),.:;=@'\-{}|/&]+"
,以防在符号,大小写和文化周围确实存在一些奇怪的行为。不,我没有创建模式,我只是在使用它,不能更改它,而且我意识到在|
之前不需要/&
。
如果我可以改变模式...
同时具有"[a-z]"
和CultureInvariant
的模式IgnoreCase
在功能上等同于"[A-Za-z]"
仅使用CultureInvariant
对吗?
假设#1是正确的,那会更有效,为什么?我猜想较短的模式可以更有效地进行评估,但是我不知道内部现在如何自信地说出来。
最佳答案
使用此程序,我们可以测试所有可能的两个字母的序列:
static void Main()
{
var defaultRegexOptions = RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture | RegexOptions.Singleline;
var regex1 = new Regex(@"^[A-Za-z]+$", defaultRegexOptions);
var regex2 = new Regex(@"^[A-Za-z]+$", defaultRegexOptions | RegexOptions.IgnoreCase);
ParallelEnumerable.Range(char.MinValue, char.MaxValue - char.MinValue + 1)
.ForAll(firstCharAsInt =>
{
var buffer = new char[2];
buffer[0] = (char)firstCharAsInt;
for (int i = char.MinValue; i <= char.MaxValue; i++)
{
buffer[1] = (char)i;
var str = new string(buffer);
if (regex1.IsMatch(str) != regex2.IsMatch(str))
Console.WriteLine("dfjkgnearjkgh");
}
});
}
较长的序列可能会有差异,但是我认为这不太可能。有力的证据表明两者之间没有区别。
该程序需要20分钟才能运行。
不幸的是,这个答案没有提供任何关于为什么的见解。
关于c# - 了解[A-Za-z]上CultureInvariant和IgnoreCase的影响,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35093279/