Natürlich können Sie die |
(Pipe?) Zum Darstellen verwenden OR
, aber gibt es auch eine Möglichkeit zum Darstellen AND
?
Insbesondere möchte ich Textabschnitte abgleichen, die ALLE einer bestimmten Phrase enthalten, jedoch in keiner bestimmten Reihenfolge.
I'd like to match paragraphs of text
.. 2. Enthält nicht ordnungsgemäßen Text. Nummer 1 ist offen für Interpretationen. Nummer 2 kann auf verschiedene Arten erfolgen. Weg 1 :(?:(?:(?(1)(?!))\b(phrase1)\b.*?|(?(2)(?!))\b(phrase2)\b.*?)){2}
, Weg 2:(?=.*\bphrase1\b)(?=.*\bphrase2\b)
In diesem Fall ist die Übereinstimmung des Absatzes in diesem Fall undefiniert, bis die Definition des Absatzes formalisiert ist.Antworten:
Verwenden Sie einen nicht konsumierenden regulären Ausdruck.
Die typische Notation (dh Perl / Java) lautet:
(?=
Ausdruck)
Dies bedeutet "Match- Ausdruck, aber danach wird der Matching am ursprünglichen Match-Punkt fortgesetzt."
Sie können so viele davon machen, wie Sie möchten, und dies wird ein "und" sein. Beispiel:
(?=match this expression)(?=match this too)(?=oh, and this)
Sie können sogar Erfassungsgruppen zu den nicht konsumierenden Ausdrücken hinzufügen, wenn Sie einige der darin enthaltenen Daten speichern müssen.
quelle
Sie müssen Lookahead verwenden, wie einige der anderen Antwortenden gesagt haben, aber der Lookahead muss andere Zeichen zwischen seinem Zielwort und der aktuellen Übereinstimmungsposition berücksichtigen. Zum Beispiel:
Mit
.*
dem ersten Lookahead können Sie die Anzahl der Zeichen abgleichen, die erforderlich sind, bevor "word1" angezeigt wird. Dann wird die Übereinstimmungsposition zurückgesetzt und der zweite Lookahead sucht nach "word2". Erneut zurücksetzen und der letzte Teil stimmt mit "word3" überein; Da es das letzte Wort ist, nach dem Sie suchen, ist es nicht notwendig, dass es sich um einen Lookahead handelt, aber es tut nicht weh.Um einem ganzen Absatz zu entsprechen, müssen Sie den regulären Ausdruck an beiden Enden verankern und ein Finale hinzufügen
.*
, um die verbleibenden Zeichen zu verbrauchen. Bei Verwendung der Perl-Notation wäre dies:Der Modifikator 'm' ist für den Mehrzeilenmodus vorgesehen. es lässt das
^
und$
an Absatzgrenzen übereinstimmen ("Zeilengrenzen" in Regex-Sprache). In diesem Fall ist es wichtig, dass Sie nicht den Modifikator 's' verwenden, mit dem das Punkt-Metazeichen sowohl mit Zeilenumbrüchen als auch mit allen anderen Zeichen übereinstimmt.Schließlich möchten Sie sicherstellen, dass Sie ganze Wörter und nicht nur Fragmente längerer Wörter abgleichen. Daher müssen Sie Wortgrenzen hinzufügen:
quelle
.*
durch[\s\S]*
in Javascript, wenn Sie neue Zeilen haben, da.
die Regex-Engine von Javascript nicht mit neuen Zeilen übereinstimmt und nicht mit Modifikatoren bearbeitet werden kannSchauen Sie sich dieses Beispiel an:
Wir haben 2 reguläre Ausdrücke A und B und wir möchten beide übereinstimmen, also sieht es im Pseudocode so aus:
Es kann ohne Verwendung des AND-Operators wie folgt geschrieben werden:
in PCRE:
quelle
(?=expr)
nicht. Es scheint implementierungsabhängig zu sein.^
"Anfang der Zeichenfolge" in der Regex-Syntax?^
ist Negation im Allgemeinen nur am Anfang einer Zeichenklasse. Es sei denn, CMake macht etwas wirklich Funky (bis zu dem Punkt, an dem die Bezeichnung der Mustervergleichssprache "Regex" als irreführend oder falsch angesehen werden könnte), war die Tatsache, dass es für Sie funktioniert hat, ein Einzelfall.Sie können dies mit einem regulären Ausdruck tun, aber wahrscheinlich möchten Sie etwas anderes. Verwenden Sie beispielsweise mehrere reguläre Ausdrücke und kombinieren Sie sie in einer if-Klausel.
Sie können alle möglichen Permutationen mit einem Standard-Regexp wie folgt auflisten (entspricht a, b und c in beliebiger Reihenfolge):
Dies führt jedoch zu einem sehr langen und wahrscheinlich ineffizienten regulären Ausdruck, wenn Sie mehr als ein paar Begriffe haben.
Wenn Sie eine erweiterte Regexp-Version wie Perl oder Java verwenden, haben sie bessere Möglichkeiten, dies zu tun. Andere Antworten haben vorgeschlagen, eine positive Lookahead-Operation zu verwenden.
quelle
a(bc|cb)|b(ac|ca)|c(ab|ba)
. Und das Wichtigste ist, dass Sie es mit allen Regex-Aromen verwenden können.Der AND - Operator ist implizit in der RegExp - Syntax.
Der OR-Operator muss stattdessen mit einer Pipe angegeben werden.
Das folgende RegExp:
bedeutet den Buchstaben
a
UND den Buchstabenb
.Es funktioniert auch mit Gruppen:
es bedeutet die Gruppe
co
UND die Gruppede
.Das Ersetzen des (impliziten) UND durch ein ODER würde die folgenden Zeilen erfordern:
quelle
Ist es in Ihrem Fall nicht möglich, das UND für mehrere übereinstimmende Ergebnisse durchzuführen? im Pseudocode
quelle
Warum nicht awk verwenden?
mit awk regex AND, OR ist so einfach
quelle
Wenn Sie reguläre Perl-Ausdrücke verwenden, können Sie einen positiven Lookahead verwenden:
Zum Beispiel
wäre Zahlen größer als 100 und teilbar durch 5
quelle
Sie können Ihre Ausgabe an einen anderen regulären Ausdruck weiterleiten. Mit grep können Sie Folgendes tun:
grep A | grep B
quelle
Neben der akzeptierten Antwort
Ich werde Ihnen einige praktische Beispiele geben, die einigen von Ihnen die Dinge klarer machen. Nehmen wir zum Beispiel an, wir haben diese drei Textzeilen:
Siehe Demo hier DEMO
Was wir hier tun möchten, ist das + -Zeichen auszuwählen, aber nur, wenn es nach zwei Zahlen mit einem Leerzeichen und vor vier Zahlen steht. Das sind die einzigen Einschränkungen. Wir würden diesen regulären Ausdruck verwenden, um dies zu erreichen:
Wenn Sie den Ausdruck trennen, erhalten Sie unterschiedliche Ergebnisse.
Oder vielleicht möchten Sie Text zwischen Tags auswählen ... aber nicht die Tags! Dann könnten Sie verwenden:
für diesen Text:
Siehe Demo hier DEMO
quelle
Die Reihenfolge ist immer in der Struktur des regulären Ausdrucks enthalten. Um das zu erreichen, was Sie wollen, müssen Sie die Eingabezeichenfolge mehrmals mit verschiedenen Ausdrücken abgleichen.
Was Sie tun möchten, ist mit einem einzigen regulären Ausdruck nicht möglich.
quelle
Verwenden Sie AND außerhalb des regulären Ausdrucks. In PHP schien der Lookahead-Operator für mich nicht zu funktionieren, stattdessen habe ich ihn verwendet
Der obige reguläre Ausdruck stimmt überein, wenn die Kennwortlänge 3 Zeichen oder mehr beträgt und das Kennwort keine Leerzeichen enthält.
quelle