我正在尝试检测组合框是否包含ISO语言代码(即en-GB,el-GR,ru-RU等),其中包含2个字母字符,短划线和2个字母字符(大写字母) ,或者它可能没关系?).
我想知道,有没有办法可以使用正则表达式实现这一点?
我假设表达式看起来像这样(但我在这个主题上没有太多经验):
string pattern = @"^\a{2,2}-\a{2,2}";
Run Code Online (Sandbox Code Playgroud)
这样的事情应该有效:^[a-z]{2}-[A-Z]{2}$.
所述^锚指示正则表达式引擎开始从字符串的开头相匹配,[a-z]装置之间的任何小写字母a和z.{2}意味着完全重复2次.其余部分也有同样的解释.最后,$指示正则表达式引擎在字符串末尾停止匹配.
如果我们仔细查看此处的 ISO 639x 代码列表,@npinti 接受的解决方案可能不够准确。或者,您可以通过调用下面的静态方法(C# 代码)自行获取区域性列表:
System.Globalization.CultureInfo.GetCultures(CultureTypes.AllCultures);
Run Code Online (Sandbox Code Playgroud)
在检索到的值中,您将发现不匹配的样本,如“Cy-az-AZ”(3 个代码!)、“zh-CHS”(3 个字母!)或“en-029”(数字!)。奇怪的是,尽管通过该方法检索到了带有数字的数字,但并没有出现在上面的 MS 链接中CultureInfo。
所以这看起来并不是一个容易的问题。我们可以尝试使用稍微复杂的正则表达式,如下所示,但这并不能保证我们能够将 ISO 区域性代码与其他任何东西区分开来。IMO,如果我们确实需要 100% 可靠,可能唯一的选择就是在代码列表中查找该代码以找到完全匹配的代码。
正则表达式选项:
^[^-]{2,3}-[^-]{2,3}(-[^-]{2,3})?$
Run Code Online (Sandbox Code Playgroud)
查找选项:
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;
}
Run Code Online (Sandbox Code Playgroud)
^[a-z]{2}(-[A-Z]{2})?$
火柴: