用于检测ISO语言代码的正则表达式

时间:2013-03-14 07:03:39

标签: c# regex winforms

我正在尝试检测组合框是否包含ISO语言代码(即en-GB,el-GR,ru-RU等),其中包含2个字母字符,短划线和2个字母字符(大写,或者可能无关紧要?)。

我想知道,有没有办法可以使用正则表达式实现这一目标?

我假设表达式看起来像这样(但我对这个主题没有多少经验):

string pattern = @"^\a{2,2}-\a{2,2}";

4 个答案:

答案 0 :(得分:9)

这样的事情应该有效:^[a-z]{2}-[A-Z]{2}$

^锚点指示正则表达式引擎从字符串的开头开始匹配,[a-z]表示az之间的任何小写字母。 {2}意味着完全重复2次。其余部分也有同样的解释。最后,$指示正则表达式引擎在字符串末尾停止匹配。

答案 1 :(得分:1)

如果我们仔细查看ISO 639x代码列表This,那么

npinti答案就不够准确。或者,您可以通过调用下面的静态方法(C#代码)自行获取文化列表:

System.Globalization.CultureInfo.GetCultures(CultureTypes.AllCultures);

在检索到的值中,您会发现非匹配样本为" Cy-az-AZ" (3个代码!)," zh-CHS" (3个字母!)或" en-029" (数字!)。 奇怪的是,即使通过CultureInfo方法检索,带有数字的那个也没有出现在上面的MS链接中。

来自here

{{3}}文章讨论了带数字的文章。

所以它似乎不是一个容易的问题。我们可以尝试使用稍微复杂的正则表达式,如下所示,但这并不能保证我们能够将ISO文化代码与其他任何东西区分开来。 IMO,如果我们真的需要100%可靠,可能唯一的选择是在代码列表中寻找代码以找到完全匹配。

正则表达式选项:

^[^-]{2,3}-[^-]{2,3}(-[^-]{2,3})?$

查找选项:

public static bool IsCultureCode(string code)
{
    CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures); //AllCultures
    int i = 0;
    while(i < cultures.Length && !cultures[i].Name.Equals(code, StringComparison.InvariantCultureIgnoreCase))
        i++;
    return i < cultures.Length;
}

答案 2 :(得分:0)

解析LCID的正则表达式:

using System;
using System.Text.RegularExpressions;

public class Example {
    public static void Main()
    {
        string pattern = @"(.*)\\(?<lcid>(?<locale>[a-z]{2})-?(?<region>[A-Z]{2})?)\\(.*)";
        string input = @"C:\MainFolder\Folder\en\translations.json C:\MainFolder\Folder\en-AU\translations.json";

        foreach (Match m in Regex.Matches(input, pattern))
        {
            Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    } 
}

答案 3 :(得分:0)

^[a-z]{2}(-[A-Z]{2})?$

  • 前两个字符必须存在且为小写
  • 最后两个字符(如果存在)必须为大写并与前两个字符用连字符分隔

匹配项:

  • en
  • zh-CN
  • tr
  • tr-TR
  • ru