RegexOptions.CultureInvariant找不到重音符匹配项

广告

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

例如:

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重载方法,该方法将用大象等替代élèphânt。

用户1519979

使用以下方法:

    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进行迭代(向后),然后根据每个匹配项的索引来编辑原始字符串。

说明:(我使用的是“我是旧的élephant”字符串)

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

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

在此处输入图片说明

如您所见,char被定义为unicode char 233或00E9(请参见http://unicode-table.com/de/#00E9

此处说明了规范化https://msdn.microsoft.com/zh-cn/library/system.text.normalizationform(v=vs.110).aspx

如文件所述:表格D:

Indicates that a Unicode string is normalized using full canonical decomposition.

这意味着该字符é被“拆分”为一个e和一个重音字符。

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

List<char> chars2 = new List<char>();
foreach(char c in str.Normalize(NormalizationForm.FormD))
{
    chars2.Add(c);
}

在此处输入图片说明

从手表中可以看出,é现在被标准化为2个字符(101(\ u0065)+ 769(\ u0301))

现在我们必须消除这些重音:遍历规范化字符串的所有字符,如果它是“ NonSpacingMark”,则将其添加到StringBuilder。

MSDN:https : //msdn.microsoft.com/zh-CN/library/system.globalization.unicodecategory(v= vs.110) .aspx

非间距标记

表示基本字符的修改的非空格字符。由Unicode名称“ Mn”表示(标记,不带空格)。取值为5。

最后,要确保现在在字符串中定义为2或3个字符的所有其他字符都已“转换”为Unicode字符符号,我们必须将新字符串归一化为FormC。

MSDN:FormC:

表示使用完全规范分解对Unicode字符串进行规范化,如果可能的话,将序列替换为其主要组合。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在MSIL中将RegexOptions编译为RegexOptions.None?

来自分类Dev

ffmpeg找不到包含重音符号的窗口标题

来自分类Dev

Regexoptions.IgnoreCase无法正常运行Regex.Replace

来自分类Dev

找不到正确的匹配项

来自分类Dev

匹配器找不到匹配项

来自分类Dev

匹配器找不到匹配项

来自分类Dev

cleartool lsview找不到匹配项

来自分类Dev

cleartool lsview找不到匹配项

来自分类Dev

找不到模板模板功能的匹配项

来自分类Dev

没有传递给 Regex 编译器的 RegexOptions 参数的默认点行为

来自分类Dev

如何使用带有起始索引和 RegexOptions 的 Regex.Matches

来自分类Dev

匹配的ORB描述符,找不到合适的匹配项

来自分类Dev

比较xml属性与String找不到匹配项

来自分类Dev

为什么Excel MATCH()找不到匹配项?

来自分类Dev

如果找不到匹配项,则按grep返回新行

来自分类Dev

MySQL仅在找不到匹配项时返回

来自分类Dev

找不到API匹配项,因此API调用无效。

来自分类Dev

如果条件找不到匹配项,则返回which()的值

来自分类Dev

如果找不到匹配项,则返回JPA查询的值

来自分类Dev

为什么在regex char可选时找不到匹配项

来自分类Dev

eslint src / ** --fix找不到任何匹配项

来自分类Dev

youtube-dl:zsh:找不到匹配项:

来自分类Dev

Firebase数组包含where子句找不到逻辑匹配项

来自分类Dev

str.contains找不到部分匹配项

来自分类Dev

如果找不到匹配项,则按grep返回新行

来自分类Dev

Java正则表达式找不到匹配项

来自分类Dev

如果在MYSQL中找不到匹配项,则die()

来自分类Dev

找不到phpSpec no beCalled([array:0])匹配项

来自分类Dev

正则表达式代码找不到匹配项

Related 相关文章

热门标签

归档