C# 检测ISO语言代码的正则表达式
我试图检测组合框是否包含ISO语言代码(即en GB、el GR、ru ru等),该代码由2个字母字符、一个破折号和另外2个字母字符组成(大写,或者可能不重要?) 我想知道,有没有一种方法可以用正则表达式实现这一点 我假设表达式看起来像这样(但我在这方面没有太多经验):C# 检测ISO语言代码的正则表达式,c#,regex,winforms,C#,Regex,Winforms,我试图检测组合框是否包含ISO语言代码(即en GB、el GR、ru ru等),该代码由2个字母字符、一个破折号和另外2个字母字符组成(大写,或者可能不重要?) 我想知道,有没有一种方法可以用正则表达式实现这一点 我假设表达式看起来像这样(但我在这方面没有太多经验): 类似这样的方法应该有效:^[a-z]{2}-[a-z]{2}$ ^锚点指示正则表达式引擎从字符串开头开始匹配,[a-z]表示a和z之间的任何小写字母{2}表示两次重复。其他人也有同样的解释。最后,$指示正则表达式引擎在字符串末尾
类似这样的方法应该有效:
^[a-z]{2}-[a-z]{2}$
^
锚点指示正则表达式引擎从字符串开头开始匹配,[a-z]
表示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);
}
}
}
使用系统;
使用System.Text.RegularExpressions;
公开课范例{
公共静态void Main()
{
字符串模式=@“(.*)\\(?(?[a-z]{2})-?(?[a-z]{2})\(.*)”;
字符串输入=@“C:\MainFolder\Folder\en\translations.json C:\MainFolder\Folder\en AU\translations.json”;
foreach(在正则表达式中匹配m.Matches(输入,模式))
{
WriteLine(“{0}”位于索引{1}.”,m.Value,m.index);
}
}
}
如果我们仔细查看ISO 639x代码列表,@npinti接受的解决方案可能不够准确。或者,您可以通过调用下面的静态方法(C#代码)自己获取区域性列表:
在检索到的值中,您会发现不匹配的样本为“Cy-az-az”(3个代码!)、“zh-CHS”(3个字母!)或“en-029”(数字!)。
奇怪的是,上面的MS链接中没有出现带数字的,即使是通过CultureInfo
方法检索的
文章从讨论一个数字
所以这似乎不是一个容易的问题。我们可以尝试使用稍微复杂一些的正则表达式,如下所示,但这不能保证我们能够将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;
}
公共静态bool IsCultureCode(字符串代码)
{
CultureInfo[]CultureInfo=CultureInfo.GetCultures(CultureType.SpecificCultures);//所有文化
int i=0;
while(i
^[a-z]{2}([a-z]{2})?$
- 前两个字符必须存在且为小写
- 最后两个字符(如果存在)必须为大写,并用连字符与前两个字符分开
- 嗯
- 恩美
- tr
- tr
- 茹
^[^-]{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;
}