C # Wortgrenze regex statt .Contains () benötigt
-
09-10-2019 - |
Frage
Ich habe eine Liste:
var myList = new List<string> { "red", "blue", "green" };
Ich habe eine Zeichenfolge:
var myString = "Alfred has a red and blue tie";
Ich versuche, eine Anzahl von Übereinstimmungen von Worten in myList
innerhalb myString
zu bekommen. Derzeit verwende ich .Contains()
, die mir eine Zählung von 3 bekommt, weil es die „rot“ in „Alfred“ aufnimmt. Ich brauche stattdessen osolate Wörter zu können. Wie kann dies erreicht werden?
var count = myList.Where(ml => myString.Contains(ml)); // gets 3, want 2
Lösung
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 werden Sie die Anzahl der Male, rot, blau oder grün zu finden sind. \ B gibt an Wortgrenze.
Jedes Element m ist vom Typ Match, und Sie bei jedem Index aussehen können weitere Informationen (dh m zu erhalten [0] .Wert gibt Ihnen die gefundenen String (rot) und m [0] .Index Sie den Speicherort gibt in der ursprünglichen Zeichenkette (13)).
Andere Tipps
var count = (from s in myList
join ms in myString.Split() on s equals ms
select new { s, ms }).Count();
So etwas wie das?
var numMatches = myString.Split().Intersect(myList).Count();
Beachten Sie, dass dies keine doppelten Ereignisse nicht berücksichtigt.
Wenn Sie Duplikate prüfen wollen, gehen Sie mit @Justin Niessner sprühte. Hier ist eine Alternative, mit einem Zwischen Lookup:
var words = myString.Split().ToLookup(word => word);
var numMatches = myList.Sum(interestingWord => words[interestingWord].Count());
Diese Werke \ Gezüchtet \ b | \ bBlue \ b | \ bgreen \ b Ich bin nicht sicher, dass es am besten optimierte