为我的目的最好的正则表达式

时间:2013-06-08 15:48:48

标签: c# regex

全部,我有以下字符串列表

List<string> list = new List<string>() 
{ 
    "Japanese (Japan) (ja-jp)",
    "Scottish Gaelic (United Kingdom) (gd-gb)", 
    "German (Germany) (de-DE)", 
    "Amharic (Ethiopia) (am-et)"
};

我想从此列表中获取以下字符串:

ja-jp
gd-gb
de-DE 
am-et

我目前正在使用群组和Regex

Regex regex = new Regex(@"(.*)\s*(\(.*\))\s*(\(.*\))");

有人可以提供更好的Regex吗?

7 个答案:

答案 0 :(得分:5)

如果您的代码始终采用该格式,则可以使用子字符串提取而不是正则表达式:

var codes = list.Select(l => l.Substring(l.Length - 6, 5)).ToList();

答案 1 :(得分:4)

怎么样:

@"^.*\(([\w\-]+)\)$"

它更短,只捕获相关文本。

答案 2 :(得分:3)

var result =  list.Select(s=>s.Split('(').Last().TrimEnd(')')).ToList();

答案 3 :(得分:1)

Regex regex = new Regex(@"^.*\((.+)\)$");

foreach (string item in list)
{
    string result = regex.Match(item).Groups[1].Value;
}

答案 4 :(得分:1)

@"(?<=[(])[a-zA-Z]{2}-[a-zA-Z]{2}(?=[)])"仅匹配括号中的xx-xx。意味着thatPattern.Match(input).Value将等于它,而不必放弃捕获组。

答案 5 :(得分:1)

var result = list.Select(s => Regex.Match(s, @"\((\w+\-\w+)\)").Groups[1].Value)
                 .ToList();

答案 6 :(得分:1)

尝试将整个模式作为结果:

Regex regex = new Regex(@"(?>[^()]+)(?=\)$)");

或简单地说:

Regex regex = new Regex(@"[^()]+(?=\)$)");