我有一個List<string>
與一些單詞。 我想要得到所有的元素,巫婆在這個模式中包含字母: a00b0c000d
- 0
是隨機字符,a,b,c,d
- 字符串中不斷的字符。通過包含字母搜索列表C#
我該怎麼做?我只能用Regex來做這個嗎?沒有任何其他解決方案?
我有一個List<string>
與一些單詞。 我想要得到所有的元素,巫婆在這個模式中包含字母: a00b0c000d
- 0
是隨機字符,a,b,c,d
- 字符串中不斷的字符。通過包含字母搜索列表C#
我該怎麼做?我只能用Regex來做這個嗎?沒有任何其他解決方案?
好,而不是一個正則表達式,你可以使用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();
好了,你可以用正則表達式和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);
在循環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
}
}
按照定義,不會IndexOfAny只返回第一個找到的索引?或者它仍然檢查給定參數中的每個字符? – KappaG3
不使用正則表達式,你很可能做一些沿
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的方法(這是我通常傾向於做的事情)。
一個有效的方法是迭代列表。
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();
不應該有開始和結束行錨''''和'$'在那裏使用,以防列表包含任何(錯誤?)更長的字符串呢? –
@ O.R.Mapper它說包含,所以我假設他沒有。不過,我會將其添加爲選項。 –
啊,真的 - 取決於問題的解釋方式(有些答案是這樣解釋的),人們可以閱讀「包含,在特定的位置」 - 事實上,你的解決方案也假定了字符的特定相對位置,就字符串邊界而言,並不是絕對的。 –