如果我基于以下模式创建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/

10-11 18:05