PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Regulärer Ausdruck: "alles außer Folge 000"


mobius
2012-10-23, 23:45:01
Nabend Forum,

arbeite mich gerade in reguläre Ausdrücke rein und es klappt eigentlich relativ gut. Probleme machen mir aber die Negationen/Subtraktionen oder wie sie genannt werden. Ausdrücke der Form [^abc] halt.

Der zu überprüfende Term soll auf "1" enden und nicht "000" enthalten.
aa00aa1 also in Ordnung, a000a1 nicht.

Mit Hilfe von Google habe eine funktionierende Lösung gebastelt, allerdings ziemlich kompliziert, nicht wirklich intuitiv und erklären könnte ich sie im Zweifelsfall auch keinem:
^([^0]*(0([^0]|0([^0]))|.{0,2}$)?)*1$

Geht es einfacher?

Zum testen benutze ich http://regex.powertoy.org/

RattuS
2012-10-24, 00:10:36
Negatives Pattern-Matching kannst du via look-ahead (?!) umsetzen.

^(.(?!000))*1$

^ // die Zeile muss von Beginn an dem Pattern entsprechen
( )* // nachfolgendes Pattern darf beliebig oft vorkommen
. // jedes Zeichen ist erlaubt
(?!000) // solange es nicht von 3 Nullen gefolgt wird
1$ // die Zeile muss auf 1 enden

Die Kernaussage ist also:
(.(?!000))*
(jedes Zeichen(nicht gefolgt von 000))beliebig oft


Ich empfehle übrigens regexpal (http://regexpal.com/).

KhanRKerensky
2012-10-24, 11:24:05
Die Kernaussage ist also:
(jedes Zeichen(nicht gefolgt von 000))beliebig oft

0001 matcht leider, da es eine 0 (jedes Zeichen) gefolgt von zwei 0 (keine drei 0) mit einer 1 dahinter ist.

Gast
2012-10-24, 13:22:49
Bugfix für RattuS' Pattern:
^((?!000).)*1$

Monger
2012-10-24, 18:47:05
Bugfix für RattuS' Pattern:
^((?!000).)*1$
Wenn ich das jetzt richtig lese, bezieht sich der negative Lookahead jetzt auf den Anchor, ergo: dieser Ausdruck matcht alles was nicht mit 000 anfängt, also z.B. auch aaaaa0001

Mit einem negative Lookbehind müsste es dann aber passen, ergo:
^((?<!000).)*1$
Das heißt: es wird jedes Zeichen gematcht, auf das nicht 000 folgt, und der gesamte Ausdruck muss mit 1 enden.

Gast
2012-10-24, 18:54:54
Mit einem negative Lookbehind müsste es dann aber passen
Eben nicht. Genau das Gegenteil ist der Fall. Probiers aus ;)

mobius
2012-10-24, 20:13:06
Bugfix für RattuS' Pattern:
^((?!000).)*1$

Vielen Dank, das funktioniert bestens. Look-around assertions waren mir noch nicht so geläufig, aber jetzt versteh ich das. Auf euch ist verlass ^^.