2016-04-19 5 views
-2

Ich habe Probleme, eine .net-Regex zu erstellen, die alle Leerzeichen findet, die nicht hinter dem Wort pi liegen.C# Regex, um alle Leerzeichen zu finden, die nicht hinter einem angegebenen Wort sind

Dies ist der String "y + pi + s + 1 = x"

ich "(?!pi\s)\s" versucht, aber es jeden Raum findet und die man nach „pi“ nicht auszuschließen. I verwenden .Net Regey Tester

Jede Hilfe

+1

Vielleicht ['\ s + (?! Pi \ b)'] (http://regexstorm.net/tester?p=%5cs%2b (% 3f! Pi% 5cb) & i = y +% 2b + pi +% 2b + s +% 2b + 1 +% 3d + x)? Oder vielleicht sogar ['(?> \ S +) (?! Pi \ b)'] (http://regexstorm.net/tester?p= (% 3f% 3e% 5cs% 2b) (% 3f! Pi% 5cb) & i = y +% 2b +++ pi +% 2b + s +% 2b + 1 +% 3d + x)? –

+1

Ich verstehe deine Frage nicht. Bitte geben Sie das erwartete String-Ergebnis und das aktuelle Ergebnis der fehlgeschlagenen Zeichenkette an. –

+0

@VisualVincent: Deshalb poste ich keine Antwort - es ist unklar. * findet alle Leerzeichen, die nicht hinter dem Wort pi *! = * stehen, schließt den nach "pi" * nicht aus. Was ist ** dahinter **? –

Antwort

1

Verwendung negative lookbehind geschätzt wird:

(?<!\bpi)\s 
+1

Vielen Dank für die schnelle Antwort. Klappt wunderbar. Ich werde den Text durcharbeiten. – bitz

2

Das Problem mit Ihrem regex ist, dass es für einen Doppelraum effektiv sucht *: die \s im Blick hinter macht es "ein Leerzeichen mit vorangestelltem 'p', 'i', '', nicht einfach ein Leerzeichen vorangestellt von 'p', 'i'

Die Lösung ist einfach - entfernen \s aus dem Lookbehind:

(?<!pi)\s 

Beachten Sie, dass diese regex Räume, die durch längere Wörter enden in pi auch, wie Principi voran überspringen würde. Wenn Sie nicht über diese Begegnungen möchten, fügen Sie \b vor pi:

(?<!\bpi)\s 

* Beachten Sie, dass Ihre Syntax für Lookbehind nicht korrekt war wegen < fehlt. Ich nehme an, es war ein Tippfehler.

+0

Er verwendete auch kein negatives Look-Behind (er verwendete negatives Look-Ahead) –

+0

@RobertMcKee Das ist auch eine faire Beobachtung. Ich korrigierte es automatisch, angenommen, es war ein Tippfehler, aber Sie haben Recht, die Syntax in der Frage ist nicht korrekt. – dasblinkenlight

+0

@dasblinkenlight - vergiss es. Ich bin ein Idiot. :-D Ich habe gerade meine Kabel gekreuzt. – Colin

Verwandte Themen