Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检测ISO语言代码的正则表达式_C#_Regex_Winforms - Fatal编程技术网

C# 检测ISO语言代码的正则表达式

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}表示两次重复。其他人也有同样的解释。最后,$指示正则表达式引擎在字符串末尾

我试图检测组合框是否包含ISO语言代码(即en GB、el GR、ru ru等),该代码由2个字母字符、一个破折号和另外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

我不能因此而获得荣誉,但请看。也可以在StackOverflow之前尝试Google:-)注意,您要做的是检测一些看起来像语言代码的东西,而不是验证它是否是真正的语言代码。最好使用/gi选项进行不区分大小写的搜索,如果它是您处理的URL,并进行全局查找(不确定在javascript中用字符串替换时是否需要g)
^[^-]{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;
}