Spielt alles was etwas ist?

8

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 ?

zu entsprechen

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 ?

übereinstimmen     
Srb1313711 10.12.2013, 10:52
quelle

6 Antworten

1
%Vor%

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:

%Vor%     
rednaw 17.12.2013 09:58
quelle
1

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.)

%Vor%

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:

%Vor%

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).

    
Adam Katz 28.01.2014 09:09
quelle
0

Wenn Sie alle Wörter mit Ausnahme von eins abgleichen möchten, können Sie negative Lookahead: \b(?!ben\b)\w*\b verwenden, aber für eine Antwort auf Ihre genaue Frage scheint Jons Kommentar der einfachste.

    
hillel 10.12.2013 11:08
quelle
0

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.

    
Ronin 07.01.2014 22:20
quelle
0

Ersetzen Sie einfach alles, was mit Ihrem Muster übereinstimmt mit einem Leerzeichen (um es zu löschen).

Sie haben nicht angegeben, welche Sprache Sie verwenden, also genetisch:

%Vor%

und Ihr anderes Beispiel:

%Vor%     
Bohemian 07.01.2014 23:20
quelle
0

Wenn Sie eine Liste von Zeichenfolgen benötigen, verwenden Sie "split on regexp" anstelle von "match on regexp".

    
Yuriy Kovalev 18.01.2014 11:51
quelle

Tags und Links