我正在尝试检测一个组合框是否包含一个 ISO 语言代码(即 en-GB、el-GR、ru-RU 等),它由 2 个字母字符、一个破折号和另外 2 个字母字符(大写,或者它可能无关紧要?)。
我想知道,有没有一种方法可以使用正则表达式来实现这一点?
我假设表达式看起来像这样(但我在这个主题上没有太多经验):
string pattern = @"^\a{2,2}-\a{2,2}";
像这样的东西应该可以工作:^[a-z]{2}-[A-Z]{2}$
.
^
锚指示正则表达式引擎从字符串的开头开始匹配,表示和[a-z]
之间的任何小写字母。意味着正好 2 次重复。其余的解释相同。最后,指示正则表达式引擎在字符串末尾停止匹配。a
z
{2}
$
如果我们仔细查看此处的 ISO 639x 代码列表,@npinti 接受的解决方案可能不够准确。或者,您可以通过调用下面的静态方法(C# 代码)自行获取文化列表:
System.Globalization.CultureInfo.GetCultures(CultureTypes.AllCultures);
在检索到的值中,您会发现不匹配的样本为“Cy-az-AZ”(3 个代码!)、“zh-CHS”(3 个字母!)或“en-029”(数字!)。奇怪的是,带有数字的那个并没有出现在上面的 MS 链接中,即使是通过该CultureInfo
方法检索到的。
所以这似乎不是一个容易的问题。我们可以尝试使用稍微复杂一点的正则表达式,如下所示,但这并不能保证我们能够将 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;
}
^[a-z]{2}(-[A-Z]{2})?$
火柴:
用于解析 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);
}
}
}