Java Regex Frage

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Java Regex Frage

Beitrag von Liffi » 05.01.2011 21:05:51

Hat zufaellig jemand im Kopf, wie ich eine Java Regex baue die das folgende matched: vorne _nicht_ ||| und hinten auch nicht.
Meine bisherigen Versuche:

Code: Alles auswählen

^|{3}?.*^|{3}?

Code: Alles auswählen

^|^|^|.*^|^|^|
Leider scheint es mit denen nicht zu gehen (ich versuche dabei immer den regular expression online test hier: http://www.regexplanet.com/simple/index.html).

syssi
Beiträge: 2951
Registriert: 24.12.2010 16:50:59
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Rheinland

Re: Java Regex Frage

Beitrag von syssi » 05.01.2011 21:27:25

Das Zeichen ^ symbolisiert einen Zeilenanfang. Das Dollar-Zeichen wiederum ein Zeilenende. Ich wuerde es deshalb so versuchen:

Code: Alles auswählen

echo "|||test|||" | grep -q '^|||.*|||$'; echo $?
echo "|||test||x|" | grep -q '^|||.*|||$'; echo $?
Also

Code: Alles auswählen

^|||.*|||$

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: Java Regex Frage

Beitrag von Liffi » 06.01.2011 10:33:22

syssi hat geschrieben:Das Zeichen ^ symbolisiert einen Zeilenanfang.
Leider ja nicht nur :-).

Code: Alles auswählen

^[.[^|]]{3,}.*
Eigentlich muesste ich damit zumindest den Anfang matchen koennen.
Kann ich aber leider nicht.
Er stoert sich damit schon an einem |, dabei sollen ihn 3 oder mehr stoeren (das ist ein geaenderte Anforderung, die mir im Schlaf eingefallen ist :-)).

EDIT::

Code: Alles auswählen

 ^[^|]{3,}.*$ 
Sieht ganz gut aus (so schoen, wie ein regex so sein kann), funktioniert aber auch nur bedingt.

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: Java Regex Frage

Beitrag von Liffi » 06.01.2011 16:35:15

Ich hab parallel noch einen Thread im Javaforum aufgemacht und die beste Loesung, die dort gepostet wurde ist:

Code: Alles auswählen

"^[|]{0,2}([^|]|(?<!^)[|]{3}(?!(?:\\||$)))+[|]{0,2}$"
Das kommt der Wunschloesung schon recht nahe.

EDIT::

Code: Alles auswählen

 ^[|]{0,2}(?!\|)([^|]|(?<!^)[|]{1,3}(?!(?:\||$)))+[|]{0,2}$ 
Das scheint wohl die entgueltige Loesung zu sein.

Antworten