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
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 に答える
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 に答える