Требуется регулярное выражение границы слова C # вместо .Contains () - PullRequest
2 голосов
/ 20 октября 2010

У меня есть список:

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

У меня есть строка:

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

Я пытаюсь получить количество совпадений слов в myList в пределах myString,В настоящее время я использую .Contains(), что дает мне счет 3, потому что он выбирает «красный» в «Альфред».Я должен быть в состоянии опровергнуть слова вместо этого.Как этого достичь?

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

Ответы [ 4 ]

4 голосов
/ 20 октября 2010
        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 имеет тип соответствия, и вы можете посмотреть на каждый индекс, чтобы получить больше информации (т. е. m [0]. Значение дает вам соответствующие строки (красный) и m[0]. Индекс дает вам местоположение в исходной строке (13)).

1 голос
/ 20 октября 2010

Как-то так?

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

Обратите внимание, что это не учитывает повторяющиеся вхождения.

Если вы хотите рассмотреть дубликаты, используйте метод @Justin Niessner.Вот альтернатива с поиском посредника:

var words = myString.Split().ToLookup(word => word);
var numMatches = myList.Sum(interestingWord => words[interestingWord].Count());
1 голос
/ 20 октября 2010
var count = (from s in myList
            join ms in myString.Split() on s equals ms
            select new { s, ms }).Count();
0 голосов
/ 20 октября 2010

это работает \ bred \ b | \ bblue \ b | \ bgreen \ b Я не уверен, что оно наиболее оптимизировано

...