2

所有,我有以下字符串列表

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吗?

4

7 回答 7

5

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

var codes = list.Select(l => l.Substring(l.Length - 6, 5)).ToList();
于 2013-06-08T15:52:50.360 回答
4

怎么样:

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

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

于 2013-06-08T15:53:12.077 回答
3
var result =  list.Select(s=>s.Split('(').Last().TrimEnd(')')).ToList();
于 2013-06-08T15:56:26.833 回答
1
Regex regex = new Regex(@"^.*\((.+)\)$");

foreach (string item in list)
{
    string result = regex.Match(item).Groups[1].Value;
}
于 2013-06-08T15:55:56.537 回答
1

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

于 2013-06-08T15:56:35.357 回答
1
var result = list.Select(s => Regex.Match(s, @"\((\w+\-\w+)\)").Groups[1].Value)
                 .ToList();
于 2013-06-08T15:59:22.640 回答
1

试试这个以获得整个模式的结果:

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

或者简单地说:

Regex regex = new Regex(@"[^()]+(?=\)$)");
于 2013-06-08T16:00:17.813 回答