2009-11-25 1 views

Antwort

1

Sie würden Negative lookarounds verwenden, aber der Ausdruck ist sehr komplex, wenn Sie die erwartete Position (oder gar Reihenfolge) der Begriffe nicht kennen. Do kennen Sie die Reihenfolge oder Muster?

Sonst würde ich Ihnen raten, ein anderes Werkzeug zu benutzen, die genauso einfach Schleife (oder eine Liste comp) über eine Datei Zeile für Zeile und tun inStr oder enthält oder andere einfache, schneller, logische Tests ...

+0

Keine Muster für meine Fälle, denke ich. Ich bin überrascht, dass diese einfache Frage für Regex so schwierig ist. – Ricky

+0

das Problem ist das Ausdrücken von Logik – annakata

23

für Visual Studio 2012 (und neuere Versionen):

^(?!.*strB).*strA.*$ 

Erläuterung:

^   # Anchor the search at the start of the line 
(?!.*strB) # Make sure that strB isn't on the current line 
.*strA.* # Match the entire line if it contains strA 
$   # Anchor the search to the end of the line 

Sie können am Ende der Regex (?:\r\n)? hinzufügen, wenn Sie die Wagenrücklauf-/Zeilenvorschübe auch zusammen mit dem Rest der Zeile entfernen möchten.

+5

Das hat funktioniert. Ich musste erweitern, um mehrere Strings für den Ausschluss zu unterstützen, was z. '^ (?!. * strB) (?!. * strC) (?!. * strD). * strA. * $'. – DuckMaestro

1

Ich gehe davon aus, dass das Suchfeld tatsächlich allgemeine reguläre Ausdrücke akzeptiert. Mit negativem Look-Ahead:

(?!^.*strB.*$)strA 

Sie müssen die mehrzeilige Optionen einzustellen (^ und $ Spiel am Anfang/Ende der Linien). Wenn Sie es nicht mit den Dialogoptionen können, versuchen Sie:

(?m)(?!^.*strB.*$)strA 

Dies ist wahrscheinlich der Standardmodus in diesem Motor though.

+0

Sie müssen den gesamten Regex verankern, nicht nur den Lookahead. Das bedeutet, dass Sie das '^' * außerhalb des Lookahead platzieren und ein weiteres '. *' Vor 'strA' hinzufügen. Aber es ist nicht notwendig, irgendeinen Teil der Regex an das * Ende * der Zeile zu verankern (d. H. Das '. * $' Kann gehen). –

+0

Nun, ich weiß es nicht. Wie ich es jetzt sehe, schrieb ich es als "wenn eine Zeile nicht strB enthält, match strA". Scheint mir immer noch richtig, da wir Zeile für Zeile zusammenpassen. Ich denke. Das Lesen von alten Regexen macht mein Gehirn weh. – wds

16

für Visual Studio 2010 (und frühere Versionen):

Das Visual Studio Suchfeld seine eigene, bizarre Version von regex Syntax hat. Dieser Ausdruck funktioniert wie gewünscht:

^~(.*strB).*strA 

^ entspricht den Anfang einer Zeile. (In der Regel für einen Texteditor, gibt es keine „mehrzeilige“ Option;. ^ und $ immer an der Linie Grenzen entsprechen)

. jedes Zeichen außer Newline. (Nicht so typisch, es scheint keinen "Single-Line" oder "Dot-All" Modus zu geben, der Punkte mit Newline übereinstimmen lässt.)

~(...) ist das "prevent match" -Konstrukt, gleichwertig (soweit ich das beurteilen kann) zum negativen Lookahead ((?!...)), das von den anderen Respondern verwendet wird.

+4

FYI, ab Visual Studio 2012 wird jetzt die dotNet Regex-Engine für Suchvorgänge verwendet, daher sollte die bizarre Syntax nun weg sein. Schöne Antwort, aber sei dir bewusst, welche Version von VS du verwendest. – redcalx

+0

Beim Testen in Visual Studio 2010 SP1Rel muss diese Antwort geändert werden, wenn "strB" AFTER "strA" sein könnte. Versuchen Sie '^ ~ (. * StrB). * StrA ~ (. * StrB)'. Oder '~ (strB). * StrA. * ~ (StrB)'. – ToolmakerSteve

0

Dieser arbeitete für mich mit Visual Studio 2010.

^+ [^ (strB)] + (strA) + [^ (strB)] + $

Verwandte Themen