正则表达式口音不敏感?

时间:2011-07-12 13:03:43

标签: c# regex diacritics non-ascii-characters

我需要在C#程序中使用正则表达式。

我要捕获具有特定结构的文件的名称。

我使用了\ w char类,但问题是这个类与任何重音字符都不匹配。

然后怎么做?我只是不想在我的模式中添加最常用的重音字母,因为我们理论上可以在每个字母上加上每个重音。

所以我虽然可能有一种语法,比如我们想要一个不区分大小写(或者一个考虑重音的类),或者一个“正则表达式”选项,它允许我不区分大小写。

你知道这样的事吗?

非常感谢

7 个答案:

答案 0 :(得分:13)

您可以简单地用字母(近似)等价替换变音符号,然后使用当前的正则表达式。

参见例如:

How do I remove diacritics (accents) from a string in .NET?

static string RemoveDiacritics(string input)
{
    string normalized = input.Normalize(NormalizationForm.FormD);
    var builder = new StringBuilder();

    foreach (char ch in normalized)
    {
        if (CharUnicodeInfo.GetUnicodeCategory(ch) != UnicodeCategory.NonSpacingMark)
        {
            builder.Append(ch);
        }
    }

    return builder.ToString().Normalize(NormalizationForm.FormC);
}

string s1 = "Renato Núñez David DeJesús Edwin Encarnación";
string s2 = RemoveDiacritics(s1);
// s2 = "Renato Nunez David DeJesus Edwin Encarnacion"

答案 1 :(得分:5)

在这个例子中,Case-insensite对我有用:

     string input =@"âãäåæçèéêëìíîïðñòóôõøùúûüýþÿı";
     string pattern = @"\w+";
     MatchCollection matches = Regex.Matches (input, pattern, RegexOptions.IgnoreCase);

答案 2 :(得分:4)

使用此\p{L}代替课程\w

\p{L}是一个带有“letter”类别的unicode代码点。所以它包括例如“äöüéè”等等。

您也可以在自己的角色类中使用它,如果您想要包含空格或像这样的点[\p{L} .]

<强>更新

好的,我认识到.net中的\w也包含Unicode字母,而不仅仅是ASCII字母。

所以我不确定你在问什么。如果你想允许看起来像字母的东西,但不是,那么我认为你最终会使用\S(不是空白)。

如果你展示一些例子,也许会有所帮助。

答案 3 :(得分:2)

试试这个:

 String pattern = @"[\p{L}\w]+"; 

答案 4 :(得分:1)

你可以尝试一下,看看它是否有效:

[\u00E9-\u00F8\w]

答案 5 :(得分:0)

请不要因此而向我开枪,但如果您只是想匹配文件名,那么为什么不采用其他方式并使用排除的字符?

 [^<>:"/\|?*]

答案 6 :(得分:-2)

你尝试过吗?它应该:匹配除换行符之外的任何单个字符。 \ w:匹配任何单词字符,包括下划线。相当于“[A-Za-z0-9_]”。 因此,排除重音字母是有道理的。

http://www.mikesdotnetting.com/Article/46/CSharp-Regular-Expressions-Cheat-Sheet