Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 理解文化变异和无知对[A-Za-z]的影响_C#_Regex_Case Insensitive_Culture - Fatal编程技术网

C# 理解文化变异和无知对[A-Za-z]的影响

C# 理解文化变异和无知对[A-Za-z]的影响,c#,regex,case-insensitive,culture,C#,Regex,Case Insensitive,Culture,如果我基于以下模式创建一个Regex:@“[a-Za-z]+”,如果我已经在使用RegOptions.CultureInvariant,那么它所匹配的集是否会通过添加RegOptions.IgnoreCase而发生变化(由于)?我认为这是一个明显的“不,这只是多余的和重复的”。在我的测试中,这就是我所展示的,但我想知道我是否因为确认偏差而遗漏了什么 如果我在这一点上错了,请纠正我,但我相信我确实需要使用文化变量,因为我也不知道文化会是什么 注意:这不是我需要使用的实际模式,只是其中最简单的关键部

如果我基于以下模式创建一个
Regex
@“[a-Za-z]+”
,如果我已经在使用
RegOptions.CultureInvariant
,那么它所匹配的集是否会通过添加
RegOptions.IgnoreCase
而发生变化(由于)?我认为这是一个明显的“不,这只是多余的和重复的”。在我的测试中,这就是我所展示的,但我想知道我是否因为确认偏差而遗漏了什么


如果我在这一点上错了,请纠正我,但我相信我确实需要使用
文化变量
,因为我也不知道文化会是什么

注意:这不是我需要使用的实际模式,只是其中最简单的关键部分。完整的模式是:
@[A-Za-z0-9\s!\\\\\\\\\\\\\\$(),.:=@'\-{}124;&]+“
,以防在符号、案例和文化周围确实存在一些奇怪的行为。不,我没有创建模式,我只是在使用它,无法更改它,我意识到在
/&
之前不需要

如果我能改变模式


  • 模式
    “[a-z]”
    同时具有
    CultureInvariant
    IgnoreCase
    在功能上等同于仅使用
    CultureInvariant
    正确吗
  • 假设#1是正确的,哪一种效率更高,为什么?我猜较短的模式更有效地进行评估,但我不知道现在内部是如何工作的,所以我很有信心地这么说

  • 所以我对这一切的运作方式有一个基本的误解。我想这就是让我失望的原因

    Regex regex = new Regex("[A-Za-z]", RegexOptions.IgnoreCase);
    

    对于
    regex.IsMatch(“ı”)
    ,将返回
    false
    ,但是对于
    regex.IsMatch(“İ”)
    ,将返回
    true
    。如果我删除
    IgnoreCase
    它会同时返回
    false
    ,如果我使用
    CultureInvariant
    (带或不带
    IgnoreCase
    ),它将返回
    false
    ,这基本上可以归结为Scott Chamberlain在评论中所说的。谢谢你,斯科特


    最终,我希望“İ”和“ı”都被拒绝,我甚至在考虑
    CultureInvariant
    之前,就把
    IgnoreCase
    加入了这一组合,从而扭转了局面。如果我删除
    IgnoreCase
    并添加
    CultureInvariant
    ,那么我可以保持模式不变,并使其与我想要的匹配

    如果我能够将模式更改为仅
    “[A-Z]”
    ,那么我就可以使用这两个标志并仍然获得所需的行为。但改变模式的一点,哪一个更有效,只是好奇而已。我不想涉及讨论中可能出现的所有问题,以及我可以改变模式的所有方式。我关心的是文化、病例不敏感和这两个
    RegexOptions


    总而言之,我需要放下
    IgnoreCase
    ,然后围绕文化的整个问题就消失了。如果模式是
    a-z
    a-z
    ,我需要使用
    IgnoreCase
    匹配上下两个字母,那么我也需要使用
    CultureInvariant

    使用此程序,我们可以测试所有可能的两个字母序列:

    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");
                }
            });
    }
    
    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=新字符[2];
    缓冲区[0]=(char)firstCharAsInt;
    
    for(int i=char.MinValue;i
    CultureInvariant
    [A-Za-z]
    没有影响,因为土耳其语i(或任何其他特定于文化的字符)不在您指定的范围内。可能在所有可能的65536个字符上运行循环?您甚至可以测试所有2个字符序列。我在这里研究答案时发现的轶事证据:表明
    [a-Za-z]
    将比使用
    RegexOptions更快。IgnoreCase
    。您是否考虑过使用中所述的内置类?如果您已经将
    CultureInvariant
    [A-Za-z]
    ,更改为
    [A-z]
    (或
    [A-z]
    )添加
    IgnoreCase
    不会改变匹配的符号集。在
    [a-Z]
    [a-Z]
    之间存在一对一的映射。大小写规则也不会影响匹配数字
    [0-9]
    ,因为没有大写和小写数字。+1,我意识到对我的问题的大量解释可以产生这样一个务实的答案,我也意识到我的问题可以归结为一个简单的“否”,以回答“它匹配的集合是否通过添加IgnoreCase而改变?”,但正如你所说,它没有提供任何见解,而这正是我所追求的——理解将这些标志与拉丁字母表中已经不区分大小写的字符组合使用的后果。