2017-01-11 6 views
0

Ich habe eine Linq-Liste mit "impportent words", die Sätze und einzelne Wörter enthält.Regex finden genaue Wörter/Sätze entsprechen

Ich brauche zu finden, wenn es irgendein Wort oder Sätze von importent_words ist, die in "sentence_to_search_for_importent_word"

Endlich sollte das Ergebnis in einem Array oder am Ende etwas gefunden wird.

hier ist, was ich bis Know getan ..

List<string> importent_words = new List<string>() {"age", "what is", ".", "pages"} 

string sentence_to_search_for_importent_words = "what is your age."; 

Ich brauche die importent_words in einem Satz zu finden und alle auf einer Liste erhalten

ausgegeben Streichhölzer

Ich versuche, diese aber es funktioniert nicht wirklich den Job

var pattern = new Regex(@"\w+"); 
var qa = pattern.Split(first_sentence.ToLower()).Where(w => importent_words.Contains(w)); 

es zurückkehren müssen „Alter“ nicht „altert“ auch sollte es finden nicht nur „was“ „was“

Mit \w scheint es Alter zu finden, aber es "this" nur dann ausgegeben, statt "this is"

Es scheint, wie das Problem ist, dass „dies“ mehr als ein Wort ist.

+5

Suchen Sie nach 'importent_words.Where (x => sentence.Contains (x))'? Warum Regex? – Sayse

+0

Ich würde zustimmen, mit einer Regex führt ein zweites Problem, Sie sind nicht auf der Suche nach einem Muster, so dass eine grundlegende Überprüfung wird zehnmal besser –

+0

Ich dachte nur, Regex war schnell, jede Lösung, die ist genauso gut ist auch gut –

Antwort

4

Wenn alles, was Sie suchen ist die wichtigen Wörter, die in Ihrem Satz erscheinen, dann können Sie nur

importent_words.Where(x => sentence.Contains(x)) 

verwenden Wenn dieser Fall sein muss unempfindlich dann können Sie einen Ersatz für die Contains(x) von der finden Antworten auf Case insensitive 'Contains(string)' (oder verwenden Sie sentence.ToLower(), wie Sie in Ihrem aktuellen Regex-Versuch zeigen)

+1

dies tat die Magie. Ich habe es zu kompliziert gemacht. –

0

Nur für den Fall, dass Sie eine erweiterbare Regex-Lösung möchten. Die Übereinstimmungen müssen für das Regex-Muster maskiert werden. Sie könnten dafür Regex.Escape() verwenden.

List<string> importent_words = new List<string>() { "age", "what is", @"\.", "ages", "bob" }; 
string sentence_to_search_for_importent_words = "what is your age. Frank"; 
string regexString = string.Join("|" , importent_words.ToArray()); 
Regex wordRegex = new Regex(regexString); 

string[] result = wordRegex.Matches(sentence_to_search_for_importent_words) 
    .Cast<Match>() 
    .Select(m => m.Value) 
    .ToArray(); 
+0

was macht das @ "\." tue –

+0

@ vor einem String in C# entkommt die Zeichen so \ wird so geschrieben, wie es ist. Regex muss angegeben werden. so dass der Zeitraum als ein Zeitraum, aber nicht als "ein einzelnes Zeichen" betrachtet wird. – Thor

+0

thx viel. machte großen Sinn. hatte den Begriff "Exscape" vorher noch nie in Regex verstanden. –

Verwandte Themen