全部,我有以下字符串列表
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
吗?
答案 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(@"[^()]+(?=\)$)");