Frage von Plasmaboy123, 49

Kann mir jemand bei einem regulären Ausdruck helfen?

"Gesucht sind alle Wörter, die genau ein a und ein o enthalten, wobei die Reihenfolge egal ist?" Ich arbeite mit egrep auf Ubuntu.

Antwort
von PWolff, 14

Leider kenne ich den Regex-Flavor von egrep nicht, aber ich denke, diese Basisfunktionen sind überall gleich.

Um sicherzustellen, dass kein Zeichen aus einer bestimmten Liste in einem Teilausdruck auftritt, nimmst du eine "negative Zeichenklasse":

[^abcxyz]

Das passt auf jedes Zeichen, das NICHT ein a, b, c, x, y oder z ist.

Dummerweise auch auf Leerzeichen. Die sollten aber auf \s passen, also probier's mal mit dem Ausdruck

[^ao\s]

Diesen Ausdruck kannst du noch mit angehängtem * modifizieren.

Dann musst du noch die gesuchten Vokale einfügen und ggf. den genannten Ausdruck an geeigneter Stelle noch mal einsetzen.

Was die Reihenfolge betrifft: Es könnte gehen, dass das mit irgendwelchen Rückgriffen geht, aber das ist ziemlich unübersichtlich. Einfacher wäre da, den Gesamtausdruck zu verdoppeln und die Zielvokale zu vertauschen.

Oder du nudelst den Text durch 2 Instanzen von grep, einmal mit einem Filter, das alles ausschließt, wo maximal 2 Buchstaben aus [ao] drin sind, das andere Mal mit einem Filter, das alles ausschließt, wo ein a oder ein o doppelt drin auftaucht.

(Möglicherweise geht auch [^ao\b] zum Ausschließen von Wortgrenzen, aber das müsstest du ausprobieren.)

Antwort
von ralphdieter, 13

Damit sollte es gehen:

[^ao]*(a[^ao]*o|o[^ao]*a)[^ao]*
Kommentar von ralphdieter ,

... vorausgesetzt, die Eingabe ist ein Wort. Sonst muss statt [^ao] der Ausdruck für "Wort ohne a und o" stehen,
z.B.: [B-NP-Zb-np-z_-]

Kommentar von ralphdieter ,

plus Wortgrenzen (\<, \>):

.*\<[^ao]*(a[B-NP-Zb-np-z]*o|o[B-NP-Zb-np-z]*a)[^ao]*\>.*

So langsam wird's unübersichtlich :-)

Kommentar von TeeTier ,

So langsam wird's unübersichtlich :-)

Im Gegenteil, ich finde deine Lösung sehr sauber und übersichtlich! Und diese Länge ist locker noch im Bereich des Akzeptablen. :)

Keine passende Antwort gefunden?

Fragen Sie die Community