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

本文关键字:正则表达式 代码 语言 检测 ISO 用于 | 更新日期: 2023-09-27 18:03:44

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

我想知道,是否有一种方法可以使用正则表达式实现这一点?

我假设表达式看起来像这样(但我在主题方面没有太多经验):

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

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

应该这样做:^[a-z]{2}-[A-Z]{2}$ .

^锚指示regex引擎从字符串开头开始匹配,[a-z]表示az之间的任何小写字母。{2}表示恰好重复2次。同样的解释也适用于其他情况。最后,$指示regex引擎在字符串末尾停止匹配。

如果我们仔细看看这里的ISO 639x代码列表,@npinti接受的解决方案可能不够准确。或者,您可以通过调用下面的静态方法(c#代码)来自己获取区域性列表:

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

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

这篇文章从这里开始讨论带有数字的。

所以这似乎不是一个容易的问题。我们可以尝试使用一个稍微复杂一点的正则表达式,如下所示,但这并不能保证我们能够将ISO文化代码与其他任何东西区分开来。在我看来,如果我们真的需要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;
}

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

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

  • en - us
  • tr
  • tr-TR
  • 俄文

Regex for parse 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);
        }
    } 
}