2017-03-22 5 views
1

Ich bin auf der Suche nach einem C# Regex, um ein komplettes Wort innerhalb eines Satzes zu entsprechen.Regex für ein Wort in einem Satz

mein Satz und Muster sieht so aus.

string mySentence = "There is no gain in this world without pain"; 

string mypattern = string.Format(@"(?:(?<=^|\s)(?=\S)|(?<=\S|^)(?=\s)){0} (?:(?<=\S)(?=\s|$)|(?<=\s)(?=\S|$))", "pain"); 

MatchCollection matches = Regex.Matches(mySentence, mypattern); 

Ich bekomme keine Übereinstimmung mit dem obigen Muster.

Aber wenn ich dieses Muster verwende, bekomme ich eine Übereinstimmung.

string mypattern = string.Format(@"\b{0}\b", "patient"); 

Aber das Problem ist es Bindestrich Wort ebenso wie in-Schmerz getrennt einstimmt, wo, wie ich für ein ganzes Wort suchen.

Jede Hilfe dankbar, danke

+1

Warten Sie, was sind die tatsächlichen Anforderungen? Passen Sie einen Suchhinweis an, der mit Whitespaces eingeschlossen ist? Oder innerhalb von Wortgrenzen, aber nicht, wenn "/" vorangestellt/gefolgt wird? –

+0

@ WiktorStribiżew Ich suche nach einem Wort, dem Zeilenvorschub oder Whitespace folgen kann. danke – Sandepku

+0

Ok, ich habe beide Lösungen zusammen mit einer Nicht-Regex-Datei bereitgestellt, für den Fall, dass Sie in längeren Strings nur nach Leerstellen von Text suchen müssen. –

Antwort

2

Szenario # 1((e) nicht voran/gefolgt mit Bindestrich)

Verwendung negativ lookarounds (?<!-) (keine - vor dem Suchbegriff) und (?!-) (keine - nach dem Suchbegriff) zusammen mit \b:

var mypattern = string.Format(@"(?<!-)\b{0}\b(?!-)", Regex.Escape(search)); 

Szenario # 2((e) eingeschlossen mit Leerzeichen)

Ich suche ein Wort entsprechen, die durch Newline oder Leerzeichen folgt oder vorangestellt werden können.

Sie benötigen lookarounds wie folgt zu verwenden:

var mypattern = string.Format(@"(?<!\S){0}(?!\S)", Regex.Escape(search)); 

Die (?<!\S) Lookarounds (gleich (?<=\s|^)) erfordert einen Leerzeichen oder Anfang Zeichenfolge vor dem Suchwort. Die negative Vorausschau (?!\S) erfordert nach dem Suchwort ein Whitespace-Symbol.

Die Regex.Escape ist ein Vorwarnschritt, um sicherzustellen, dass alle Sonderzeichen innerhalb des Suchworts als Literalzeichen behandelt werden.

Ein Hinweis: Wenn Ihre "Wörter" nie ein Leerzeichen enthalten, brauchen Sie keine Regex. Verwenden Sie

var search = "this"; 
var sentence = "There is no gain in this world without pain"; 
var isPresent = sentence.Split().Contains(search); 
Console.Write(isPresent); // = > True 
+0

Ich versuchte diese Aussage, Es kann keinen Gewinn ohne Schmerz geben. aber ich habe keine Übereinstimmungen gefunden, ich glaube, ich habe vergessen, dir zu sagen, dass es einen Punkt oder ein Sonderzeichen geben kann, – Sandepku

+1

Also, 'var mypattern = string.Format (@" (?

+1

Ich denke, diese Regex in Szenario # 1 funktioniert für mich:) - Danke – Sandepku

Verwandte Themen