7

次のような文字列のリストがあります。

List<string> list = new List<string>();
list.Add("Item 1: #item1#");
list.Add("Item 2: #item2#");
list.Add("Item 3: #item3#");

部分文字列 #item1#、#item2# などを取得して新しいリストに追加するにはどうすればよいですか?

これを行うことで、「#」が含まれている場合にのみ完全な文字列を取得できます。

foreach (var item in list)
{
    if(item.Contains("#"))
    {
        //Add item to new list
    }
}
4

7 に答える 7

14

をご覧いただけますRegex.Match。正規表現について少し知っている場合 (あなたの場合は非常に単純なパターンになります: )、それを使用して、その間以外の任意の数の他の文字で"#[^#]+#"始まり、終わるすべてのアイテムを抽出できます。'#''#'

例:

Match match = Regex.Match("Item 3: #item3#", "#[^#]+#");
if (match.Success) {
    Console.WriteLine(match.Captures[0].Value); // Will output "#item3#"
}
于 2013-02-14T08:29:50.333 に答える
3

LINQ で正規表現を使用する別の方法を次に示します。(正確な要件が正規表現を参照しているかわからないため、2 つの問題が発生する可能性があります。)

var list = new List<string> ()
{
    "Item 1: #item1#",
    "Item 2: #item2#",
    "Item 3: #item3#",
    "Item 4: #item4#",
    "Item 5: #item5#",
};

var pattern = @"#[A-za-z0-9]*#";

list.Select (x => Regex.Match (x, pattern))
    .Where (x => x.Success)
    .Select (x => x.Value)
    .ToList ()
    .ForEach (Console.WriteLine);

出力:

#アイテム1#

#アイテム2#

#it​​em3#

#it​​em4#

#it​​em5#

于 2013-02-14T08:46:10.173 に答える
2

LINQ はうまく機能します。

var newList = list.Select(s => '#' + s.Split('#')[1] + '#').ToList();

または、クエリ式を好む場合:

var newList = (from s in list
               select '#' + s.Split('#')[1] + '#').ToList();

または、Botz3000 で提案されているように正規表現を使用し、それらを LINQ と組み合わせることができます。

var newList = new List(
    from match in list.Select(s => Regex.Match(s, "#[^#]+#"))
    where match.Success
    select match.Captures[0].Value
);
于 2013-02-14T08:32:56.113 に答える
1

コードはあなたの問題を解決します。ただし、文字列に含まれていない場合 #item#は、元の文字列が使用されます。

var inputList = new List<string>
    {
        "Item 1: #item1#",
        "Item 2: #item2#",
        "Item 3: #item3#",
        "Item 4: item4"
    };

var outputList = inputList
    .Select(item =>
        {
            int startPos = item.IndexOf('#');
            if (startPos < 0)
                return item;

            int endPos = item.IndexOf('#', startPos + 1);
            if (endPos < 0)
                return item;
            return item.Substring(startPos, endPos - startPos + 1);
        })
    .ToList();
于 2013-02-14T08:33:57.693 に答える
0

これはどう:

List<string> substring_list = new List<string>();
foreach (string item in list)
{
    int first = item.IndexOf("#");
    int second = item.IndexOf("#", first);
    substring_list.Add(item.Substring(first, second - first);
}
于 2013-02-14T08:30:17.960 に答える
0

次を使用するだけでそれを行うことができます。

    List<string> list2 = new List<string>();
    list.ForEach(x => list2.Add(x.Substring(x.IndexOf("#"), x.Length - x.IndexOf("#"))));
于 2013-02-14T08:30:47.080 に答える
0

これを試して。

var itemList = new List<string>();
foreach(var text in list){
string item = text.Split(':')[1];
itemList.Add(item);


}
于 2013-02-14T08:31:47.130 に答える