在C#中按包含字母搜索列表

6

我有一个包含一些单词的 List<string>。我想获取所有包含以下模式的元素: a00b0c000d - 0 是任意字符,a,b,c,d 是字符串中的常量字符。

我该怎么做?我是否只能使用正则表达式?还有其他解决方案吗?

5个回答

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);

在那里不应该使用行首和行尾锚点 ^$,以防列表中包含任何(错误的?)更长的字符串吗? - O. R. Mapper
@O.R.Mapper它说包含,所以我认为他没有。不过,我会将其作为一个选项添加进去。 - It'sNotALie.
1
啊,没错 - 根据问题的解释方式(有些答案就是这样解释的),人们可以读作“在特定位置包含”- 实际上,您的解决方案也假定了字符之间的相对位置是特定的,只是没有与字符串边界的绝对位置相关。 - O. R. Mapper

1
你可以在遍历列表后使用 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。

根据定义,IndexOfAny难道不仅会返回第一个找到的索引吗?或者它依旧会检查给定参数内的每个字符吗? - KappaG3

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();

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;
        }

为了获得你想要的结果。我还没有对这段代码进行分析,所以它可能比使用正则表达式慢很多,但它应该可以让你避免完全使用正则表达式(这是我通常倾向于做的事情)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接