我正在尝试检测组合框是否包含ISO语言代码(即en-GB,el-GR,ru-RU等),其中包含2个字母字符,短划线和2个字母字符(大写,或者可能无关紧要?)。
我想知道,有没有办法可以使用正则表达式实现这一目标?
我假设表达式看起来像这样(但我对这个主题没有多少经验):
string pattern = @"^\a{2,2}-\a{2,2}";
答案 0 :(得分:9)
这样的事情应该有效:^[a-z]{2}-[A-Z]{2}$
。
^
锚点指示正则表达式引擎从字符串的开头开始匹配,[a-z]
表示a
和z
之间的任何小写字母。 {2}
意味着完全重复2次。其余部分也有同样的解释。最后,$
指示正则表达式引擎在字符串末尾停止匹配。
答案 1 :(得分:1)
npinti答案就不够准确。或者,您可以通过调用下面的静态方法(C#代码)自行获取文化列表:
System.Globalization.CultureInfo.GetCultures(CultureTypes.AllCultures);
在检索到的值中,您会发现非匹配样本为" Cy-az-AZ" (3个代码!)," zh-CHS" (3个字母!)或" en-029" (数字!)。
奇怪的是,即使通过CultureInfo
方法检索,带有数字的那个也没有出现在上面的MS链接中。
{{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})?$
匹配项: