Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.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# RegexOptions.CultureInvariant未找到口音匹配项_C#_Regex - Fatal编程技术网

C# RegexOptions.CultureInvariant未找到口音匹配项

C# RegexOptions.CultureInvariant未找到口音匹配项,c#,regex,C#,Regex,我想创建一个忽略重音的正则表达式 例如: string s = "I am an old élephant"; string pattern = "elephant"; bool result = new Regex(pattern, RegexOptions.CultureInvariant).IsMatch(s); 我的测试文化是: System.Globalization.CultureInfo.CurrentCulture = Fr-fr 所以我本以为这段代码会找到匹配项,但事实并非

我想创建一个忽略重音的正则表达式

例如:

string s = "I am an old élephant";
string pattern = "elephant";
bool result = new Regex(pattern, RegexOptions.CultureInvariant).IsMatch(s);
我的测试文化是:

System.Globalization.CultureInfo.CurrentCulture = Fr-fr
所以我本以为这段代码会找到匹配项,但事实并非如此

有没有一个简单的方法可以找到匹配的


我正在尝试创建一个StringReplace重载方法,用elephant替换élèph–nt等等。

您正在指定一个CultureInvariant正则表达式。这意味着你的文化被忽略了。所以你要么删除这个选项

bool result = new Regex(pattern).IsMatch(s);
…或者,如果您想独立于文化,请扩展您的模式:

string pattern = "[eé]lephant";
使用以下方法:

    public string removeDiacritics(string str)
    {
        var sb = new StringBuilder();

        foreach (char c in str.Normalize(NormalizationForm.FormD))
        {
            if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
            {
                sb.Append(c);
            }
        }
        return sb.ToString().Normalize(NormalizationForm.FormC);
    }
那就行了

        string s = "I am an old élephant";
        string pattern = "elephant";
        bool result = new Regex(pattern, RegexOptions.IgnoreCase).IsMatch(removeDiacritics(s)); //true
如果必须替换某些内容,例如通过matchcollection进行迭代(向后),并根据每个匹配的索引编辑原始字符串

解释:(我用的是“我是一个老的”字串)

让我们将原始字符串的所有字符写入一个列表:

foreach (char c in str)
{
    chars1.Add(c);
}

如您所见,字符定义为unicode字符233或00E9(请参阅)

这里解释了标准化

正如文件所说: 表格D:

这意味着字符被“拆分”为e和重音字符

要检查这一点,让我们输出归一化字符串的字符:

List<char> chars2 = new List<char>();
foreach(char c in str.Normalize(NormalizationForm.FormD))
{
    chars2.Add(c);
}
List chars2=新列表();
foreach(str.Normalize(NormalizationForm.FormD)中的字符c)
{
第2条.加入(c);
}

如表中所示,é现在被标准化为2个字符(101(\u0065)+769(\u0301))

现在我们必须消除这些口音: 迭代归一化字符串的所有字符,如果是“非间隔标记”,则将其添加到StringBuilder

MSDN:

不间断标记

指示基字符修改的非空格字符。 由Unicode名称“Mn”(标记,非空格)表示。这个 值为5

最后,为了确保所有其他字符(现在在字符串中定义为2或3个字符)都“转换”为unicode字符符号,我们必须将新字符串规范化回FormC

MSDN: 表格C:

指示Unicode字符串使用完全规范化 分解,然后用其 初级复合材料,如有可能


如果要使用正则表达式,可以使用
\p{L}
来声明给定的unicode字符是字母

        string s = "I am an old ùûüÿàâçéèêëïîô";
        string pattern = @"(\p{L})";
        var regex = new Regex(pattern);
        var result = regex.Replace(s, @"$1");
        Console.WriteLine(result);//I am an old uuuyaaceeeeiio

“测试时我的区域性”不相关,因为您指定了
RegexOptions.CultureInvariant
@A.D。请查看默认值,如果没有RegexOptions.CultureInvariant,它将不起作用。我的理解是RegexOptions.CultureInvariant标记将使其匹配,但我误解了.string pattern=“[eé]lephant”;这不是我要寻找的,因为我正在寻找一种通用方法,以便在比较带重音的字符串和不带重音的字符串时找到匹配项。实际上,我正在尝试创建一个StringReplace重载方法,该方法将用elephant等替换élèph–nt。您可以在那里指定您的区域性。正则表达式将帮助您精确匹配;对于文化敏感的搜索,它不是很有用。你也应该更新你的问题以提供这类信息,否则你将得不到你想要的。那会有用的。Thx for this:)@user1519999:也许你应该详细说明一下它的工作原理。我明白你在做什么,但我不确定每个人都知道…@Sefe done.)美好的
        string s = "I am an old ùûüÿàâçéèêëïîô";
        string pattern = @"(\p{L})";
        var regex = new Regex(pattern);
        var result = regex.Replace(s, @"$1");
        Console.WriteLine(result);//I am an old uuuyaaceeeeiio