在C#中选择具有重复字符的字符串

时间:2015-02-02 23:58:34

标签: c# regex string linq

如何在C#中使用linq查询来查找包含“B”和“BZ”的字符串?要找到只有“B”的字符串,我使用:

var query = from c in mapping
             where c.code.Contains("B") 
             select c;'

但是如果我说where c.code.Contains("B") && where c.code.Contains("BZ")显然我只得到了具有BZ的字符串,因为第一个约束将在第二个约束中得到满足。但我需要的是让字符串都有“B”和“BZ”。 (实际上我的话应该有两个B)。

5 个答案:

答案 0 :(得分:4)

我建议使用正则表达式,例如:

    where Regex.Match(c, ".*(B.*BZ)|(BZ.*B).*").Success

样品:

    static void Main()
    {
        var mapping = new[]
        {
            "BBZ",
            "B",
            "ABBA",
            "BZBZ",
            "BZAB",
            "BBZ",
            "ZBBAZ"
        };

        // the code
        var query = from c in mapping
                    where Regex.Match(c, ".*(B.*BZ)|(BZ.*B).*").Success
                    select c;

        Console.WriteLine("Matched:");
        foreach (string s in query)
        {
            Console.WriteLine(s);
        }
    }

输出:

Matched:
BBZ
BZBZ
BZAB
BBZ

答案 1 :(得分:1)

  实际上我的话应该有两个B

(如果你想在Linq中使用)

   var query = mapping.code.Where(s => s.Count(f=>f=='B')==2);

答案 2 :(得分:1)

不依赖于正则表达式的解决方案

            var x = from s in mapping
                let index1 = s.IndexOf("BZ") // find any 'BZ' in the string
                where index1 > -1 // ensure that a 'BZ' was found else the following queries will throw
                let index2 = s.IndexOf('B', 0, index1) // find the first B in the string
                let index3 = s.IndexOf('B', index1 + 1) // find a second B in the string
                where index2 > -1 || index3 > -1
                select s;

诀窍是首先找到BZ,然后在找到的BZ之前或之后找到B。 IndexOf运算符是完美的,因为它允许我们选择一个起始位置(在找到的BZ之后)和一个计数(在找到的BZ之前)。

答案 3 :(得分:1)

如果字符串中只有BBZ,则可以检查字符串中B出现的次数。因此,如果您检查BZ并检查B至少发生2次,那么您将获得所需的字符串

var query = from c in mapping
    where c.code.Contains("B") &&  // not really necessary but I keep it to make it explicit what we are looking for.
          c.code.Contains("BZ") && 
          c.code.Count(l => l == 'B') >= 2
    select c;

答案 4 :(得分:0)

你应该只有一个where子句。你的第二个地方搞乱了。

where c.code.Contains("B") && c.code.Contains("BZ")