2013-07-27 7 views
6

我有一個List<string>與一些單詞。 我想要得到所有的元素,巫婆在這個模式中包含字母: a00b0c000d - 0是隨機字符,a,b,c,d - 字符串中不斷的字符。通過包含字母搜索列表C#

我該怎麼做?我只能用Regex來做這個嗎?沒有任何其他解決方案?

回答

5

好,而不是一個正則表達式,你可以使用LINQ查詢在相應的位置特定的字符。但我絕對會喜歡正則表達式。

var result = yourList 
    .Where(x => x[0] == "a") 
    .Where(x => x[3] == "b") 
    .Where(x => x[5] == "c") 
    .Where(x => x[9] == "d") 
    .ToList(); 
2

好了,你可以用正則表達式和LINQ做到這一點:

Regex yourRegex = new Regex(@"a..b.c...d"); 
//if you want whole string match use ^a..b.c...d$ 
var result = yourList.Where(yourRegex.IsMatch); 
+0

不應該有開始和結束行錨''''和'$'在那裏使用,以防列表包含任何(錯誤?)更長的字符串呢? –

+0

@ O.R.Mapper它說包含,所以我假設他沒有。不過,我會將其添加爲選項。 –

+1

啊,真的 - 取決於問題的解釋方式(有些答案是這樣解釋的),人們可以閱讀「包含,在特定的位置」 - 事實上,你的解決方案也假定了字符的特定相對位置,就字符串邊界而言,並不是絕對的。 –

1

在循環List之後,您可以使用IndexOfAny()字符串方法。 IndexOfAny在字符串中搜索很多值。

List<string> words = new List<string>(); 
foreach(string word in words) 
{ 
    int match = word.IndexOfAny(new char[] {'a', 'b', 'c', 'd'}); 
    if(match!=-1) 
    { 
     //Processing Logic here 
    } 
    } 
  • 它報告中的Unicode字符指定數組中的任何字符的此實例中第一次出現的索引。
  • 如果在此實例中未找到數組中的字符,則此方法返回-1。
+0

按照定義,不會IndexOfAny只返回第一個找到的索引?或者它仍然檢查給定參數中的每個字符? – KappaG3

0

不使用正則表達式,你很可能做一些沿

 List<string> stromgs = new List<string>(); 

     foreach (var s in stromgs) 
     { 
      var sa = s.Select(c => c.ToString(CultureInfo.InvariantCulture)).ToArray(); 

      if (sa.Contains("a") && sa.Contains("b") && sa.Contains("c") && sa.Contains("d")) 
       yield return s; 
     } 

行爲了得到你之後的結果。我沒有分析這個代碼,所以它可能比我所知道的使用正則表達式慢很多,但它應該給你一種完全避免Regex的方法(這是我通常傾向於做的事情)。

1

一個有效的方法是迭代列表。

List<string> matches = new List<string>(); 
myList.ForEach((x) => { if(x[0] == 'a' && x[3] == 'b' && x[5] == 'c' && x[9] == 'd') matches.Add(x); }); 

或者你可以使用LINQ,它可能稍微慢一些,但不太可能成爲瓶頸。

var matches = myList.Where(x => x[0] == 'a' && x[3] == 'b' && x[5] == 'c' && x[9] == 'd').ToList();