Mit Regex wie kann man alles in einer Zeichenfolge zusammenbringen, die nicht etwas ist? Dies mag nicht sinnvoll sein, aber lesen Sie weiter.
Also nimm das Wort baby
zum Beispiel, um allem zu entsprechen, was nicht ist a b
würdest du etwas wie [^b]
machen und dies würde a
und y
entsprechen. Einfach genug! Aber wie in dieser Zeichenkette Ben sits on a bench
kann ich alles, was nicht ben
ist übereinstimmen, so dass ich versuchen würde, sits on a ch
?
Besser noch alles zusammenpassen, was kein Muster ist? z.B. in 1a2be3
stimmt mit allem überein, was nicht number,letter,number
ist, daher würde jede Kombination in der Zeichenkette außer 1a2
?
Was diese Regex macht, ist ben
oder irgendein anderes Zeichen, aber ben
wird nicht erfasst, aber die anderen Zeichen sind. Du wirst also viele Matches haben, außer den ben
. Dann können Sie alle diese Übereinstimmungen zusammenfügen, um die Zeichenfolge ohne die ben
s zu erhalten.
Hier ein Beispiel in Python.
%Vor%Dies wird ausgegeben:
%Vor% Beachten Sie das führende Leerzeichen. Sie können das natürlich entfernen, indem Sie .strip()
hinzufügen.
Beachten Sie auch, dass es wahrscheinlich schneller ist, eine Regex zu erstellen, die ben
durch eine leere Zeichenfolge ersetzt, um das gleiche Ergebnis zu erhalten. Aber wenn Sie diese Technik in einer komplexeren Regex verwenden möchten, könnte es sich als nützlich erweisen.
Und natürlich können Sie auch komplexere Regexes an die Stelle von ben
setzen, also wäre zum Beispiel Ihr number,letter,number
Beispiel:
Kurze Antwort: Sie können nicht tun, was Sie fragen. Technisch hat der erste Teil eine hässliche Antwort, aber der zweite Teil (wie ich es verstehe) hat keine Antwort.
Für Ihren ersten Teil habe ich eine ziemlich unpraktische (aber reine Regex) Antwort; etwas Besseres würde Code erfordern (wie @ rednaws viel sauberere Antwort oben). Ich fügte dem Test hinzu, um es umfassender zu machen. (Der Einfachheit halber verwende ich grep -Pio
für PCRE, case insensitive, drucke eine Übereinstimmung pro Zeile.)
Ich mache im Prinzip einen Sonderfall für jeden Buchstaben in "ben", also kann ich nur Iterationen einschließen, die nicht selbst Teil der Zeichenkette "ben" sind. Wie gesagt, nicht wirklich praktisch, auch wenn ich technisch deine Frage beantworte. Ich habe auch eine detaillierte Erklärung dieses Regex gespeichert , wenn Sie weitere Details wünschen.
Wenn Sie gezwungen sind, einen reinen Regex anstelle von Code zu verwenden, sollten Sie für solche Dinge am besten Code in generieren schreiben. Auf diese Weise können Sie eine saubere Kopie davon behalten.
Ich bin nicht sicher, was Sie für den Rest Ihrer Herausforderung fragen; eine Regex ist entweder gierig oder faul [1] [2] , und ich kenne keine Implementierungen, die" jede Kombination "finden können, anstatt nur die erste Kombination mit beiden Methoden. Wenn es so etwas gäbe, wäre es im wirklichen Leben sehr langsam (eher als schnelle Beispiele); Die langsame Geschwindigkeit von Regex-Engines wäre unerträglich, wenn sie gezwungen wären, jede Möglichkeit zu prüfen, was im Grunde eine ReDoS . Beispiele: Ich nehme an, Sie suchen nach 1
1a
a
a2
a2b
a2be
a2be3
2
2b
2be
2be3
b
be
be3
e
e3
3
aber ich denke nicht, dass du das mit einer reinen Regex erreichen kannst. Du benötigst etwas Code, um jede Teilzeichenkette zu erzeugen, und dann kannst du eine Regex verwenden, um das verbotene Muster herauszufiltern (wieder geht es hier nur um gierige vs faul gegen ReDoS).
Okay Das einfachste was zu tun ist, entspricht allem
%Vor%Passen Sie dann auf das Muster, das angepasst wird, ein anderes Match für Was Sie nicht möchten (z. B. In Perl wird das Muster in der Variablen $ & amp; angepasst).
Wenn es übereinstimmt, ist das nicht, was Sie wollen, sonst haben Sie Ihre Übereinstimmung.
Einfaches A-B, wo A alles ist (. *?) und B ist das, was du nicht willst.So machst du zwei Matches, aber ich denke, das ist in Ordnung.
Wenn Sie eine Liste von Zeichenfolgen benötigen, verwenden Sie "split on regexp" anstelle von "match on regexp".
Tags und Links regex