1021 Stimmen

Reguläre Ausdrücke: Gibt es einen AND-Operator?

Natürlich können Sie die | (Rohr?) zu repräsentieren OR aber gibt es eine Möglichkeit, die AND auch?

Konkret möchte ich Textabschnitte abgleichen, die ALLE einen bestimmten Satz enthalten, aber in keiner bestimmten Reihenfolge.

2 Stimmen

Meinen Sie damit, dass Sie Phrasen in einem Text finden wollen, wobei jede dieser Phrasen eine gültige Permutation der Wörter in einer gegebenen Phrase ist?

3 Stimmen

Ich stelle das hier rein, weil drei oder vier Antworten es ignorieren. Lookahead stimmt nicht für jede Klausel mit der gleichen Länge überein, es sei denn, sie enden auf $. Ein Lookahead könnte auf vier Zeichen passen, ein anderer auf 6. Zum Beispiel wird (?=a*)(?=aab) mit aabaaaaba übereinstimmen.

4 Stimmen

Versuchen Sie, nur das "Leerzeichen" für den Operator "AND" zu verwenden.

12voto

mug896 Punkte 1485

Warum nicht awk verwenden?
mit awk regex AND, OR ist das so einfach

awk '/WORD1/ && /WORD2/ && /WORD3/' myfile

11voto

pilif Punkte 12278

Die Reihenfolge ist immer in der Struktur des regulären Ausdrucks impliziert. Um das Gewünschte zu erreichen, müssen Sie die Eingabezeichenfolge mehrmals mit verschiedenen Ausdrücken abgleichen.

Was Sie tun möchten, ist ノット mit einer einzigen Regexp möglich.

0 Stimmen

Es ist technisch nicht unmöglich, aber es lohnt sich nicht, es umzusetzen. Ich weiß allerdings nicht, warum jemand es heruntergestuft hat...

13 Stimmen

Wahrscheinlich, weil es nicht nur möglich, sondern auch einfach ist, vorausgesetzt, Ihre Regex-Variante unterstützt Lookaheads. Und das ist eine gute Wette; die meisten der heutigen großen Programmiersprachen unterstützen sie.

10voto

jpalecek Punkte 45829

Wenn Sie reguläre Ausdrücke in Perl verwenden, können Sie positive Vorausschau verwenden:

Zum Beispiel

(?=[1-9][0-9]{2})[0-9]*[05]\b

wären Zahlen, die größer als 100 und durch 5 teilbar sind

9voto

DevWL Punkte 14388

Zusätzlich zu der akzeptierten Antwort

Ich werde Ihnen einige praktische Beispiele geben, die einigen von Ihnen mehr Klarheit verschaffen werden. Nehmen wir zum Beispiel an, wir haben diese drei Textzeilen:

[12/Oct/2015:00:37:29 +0200] // only this + will get selected
[12/Oct/2015:00:37:x9 +0200]
[12/Oct/2015:00:37:29 +020x]

Siehe Demo hier DEMO

Was wir hier tun wollen, ist das +-Zeichen auszuwählen, aber nur, wenn es nach zwei Zahlen mit einem Leerzeichen steht und wenn es vor vier Zahlen steht. Das sind die einzigen Beschränkungen. Wir würden diesen regulären Ausdruck verwenden, um dies zu erreichen:

'~(?<=\d{2} )\+(?=\d{4})~g'

Beachten Sie, dass Sie unterschiedliche Ergebnisse erhalten, wenn Sie den Ausdruck trennen.

Oder vielleicht wollen Sie einen Text zwischen den Tags auswählen... aber nicht die Tags! Dann könnten Sie verwenden:

'~(?<=<p>).*?(?=<\/p>)~g'

für diesen Text:

<p>Hello !</p> <p>I wont select tags! Only text with in</p> 

Siehe Demo hier DEMO

0 Stimmen

Welche Antwort war die akzeptierte Antwort? Bitte fügen Sie einen Link dazu hinzu, damit ich sie in Zukunft lesen kann.

8voto

garbagecollector Punkte 3481

Sie können Ihre Ausgabe in eine andere Regex leiten. Mit grep könnten Sie dies tun:

grep A | grep B

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X