需要C#字边界正则表达式而不是.Contains()

时间:2010-10-20 19:05:59

标签: c# asp.net regex linq word-boundary

我有一个清单:

var myList = new List<string> { "red", "blue", "green" };

我有一个字符串:

var myString = "Alfred has a red and blue tie";

我正在尝试计算myListmyString内的字词匹配数。目前,我正在使用.Contains(),这使得我数为3,因为它正在拾取“Alfred”中的“红色”。我需要能够代替词语。如何实现这一目标?

var count = myList.Where(ml => myString.Contains(ml)); // gets 3, want 2

4 个答案:

答案 0 :(得分:4)

        var myList = new List<string> { "red", "blue", "green" };
        Regex r = new Regex("\\b(" + string.Join("|", myList.ToArray()) + ")\\b");
        MatchCollection m = r.Matches("Alfred has a red and blue tie");

m.Count会给你红色,蓝色或绿色的次数。 \ b指定单词边界。

m的每个元素都是Type Match,您可以查看每个索引以获取更多信息(即m [0] .Value为您提供匹配的字符串(红色)和m [0] .Index为您提供位置在原始字符串(13))。

答案 1 :(得分:1)

var count = (from s in myList
            join ms in myString.Split() on s equals ms
            select new { s, ms }).Count();

答案 2 :(得分:0)

这样的东西?

var numMatches = myString.Split().Intersect(myList).Count();

请注意,这不会考虑重复出现。

如果你想考虑重复,请使用@Justin Niessner的技巧。 这是一个替代方案,具有中间查找:

var words = myString.Split().ToLookup(word => word);
var numMatches = myList.Sum(interestingWord => words[interestingWord].Count());

答案 3 :(得分:0)

这是有效的 \ bred \ by blue \ v | \ green \ b 我不确定它是最优化的