C # parola regex confine anziché .Contains () necessaria
-
09-10-2019 - |
Domanda
Ho una lista:
var myList = new List<string> { "red", "blue", "green" };
Ho una stringa:
var myString = "Alfred has a red and blue tie";
Sto cercando di ottenere un conteggio di partite di parole myList
all'interno myString
. Attualmente, sto usando .Contains()
, il che mi fa un conteggio di 3, perché è in ripresa il "rosso" in "Alfred". Ho bisogno di essere in grado di parole osolate invece. Come può essere raggiunto?
var count = myList.Where(ml => myString.Contains(ml)); // gets 3, want 2
Soluzione
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 vi darà il numero di volte in rosso, blu o verde si trovano. \ B specifica limite di parola.
Ogni elemento di m è del tipo di corrispondenza, e si può guardare ogni indice per maggiori informazioni (ad esempio m [0] .Value ti dà la stringa corrispondente (rosso) e m [0] .Index ti dà la posizione nella stringa originale (13)).
Altri suggerimenti
var count = (from s in myList
join ms in myString.Split() on s equals ms
select new { s, ms }).Count();
Una cosa come questa?
var numMatches = myString.Split().Intersect(myList).Count();
Si noti che questo non considera le occorrenze duplicati.
Se si vuole prendere in considerazione i duplicati, andare con la tecnica di @Justin Niessner. Ecco un'alternativa, con una ricerca intermediario:
var words = myString.Split().ToLookup(word => word);
var numMatches = myList.Sum(interestingWord => words[interestingWord].Count());
Questa opere \ Allevati \ b | \ bBlue \ b | \ bgreen \ b Non sono sicuro che è più ottimizzato