Java Regex Frage

  • Themenstarter Themenstarter RegexUser
  • Beginndatum Beginndatum
R

RegexUser

Gast
Kann mir jemand sagen, wie ich eine Java Regex baue die das folgende matched: vorne _nicht_ das Symbol | dreimal oder oefter und hinten auch nicht.
Meine bisher bester Versuch (testweise nur das matchen vorne, hinten wird ja dann aehnlich sein):
Code:
^[^|]{3,}.*$
Leider matched stoert diese Regex sich auch an einfachen | Symbolen vorne oder hinten
 
Moin,

so aus dem Bauch heraus würde ich es so schreiben :
Java:
[^|]{0,3}.*$

kleiner Tipp am Rande in diesem Zusammenhang!

Wir nutzen hier in der Firma zum Testen von regulären Ausdrücken das nette kleine
Tool "RegEx coach"! Es kann zusammen mit seiner Doku hier runtergeladen werden:
The Regex Coach - interactive regular expressions ("Windows installer" oder "Linux tar archive")

Es eignet sich auch gut zur Einarbeitung in dieses Thema!

Eine gute Übersicht zu den Java Pattern liefert diese Seite:
Pattern (Java Platform SE 6)

Gruß
Klaus
 
Moin,

also nochmal zum Verständnis
Java:
String sTMP1 = "|||abcde|||";  // soll matchen
String sTMP2 = "||||abcde||||";  // soll nicht matchen

vielleicht dann besser so:
Java:
^ [|]{0,3} ([a-zA-Z0-9])* [|]{0,3} $

Gruß
Klaus
 
Moin,

also nochmal zum Verständnis
Java:
String sTMP1 = "|||abcde|||";  // soll matchen
String sTMP2 = "||||abcde||||";  // soll nicht matchen
Ich hab mich leider unklar ausgedrueckt:

Java:
String sTMP1 = "|||abcde|||";  // soll nicht matchen
String sTMP2 = "||||abcde||||";  // soll nicht matchen
String sTMP3 = "||abcde||";  // soll matchen
String sTMP4 = "abcde|||";  // soll nicht matchen
String sTMP5 = "|||abcde";  // soll nicht matchen

Mit Beispielen ist es einfach klarer.
 
Die einfachsten Beispiele, die matchen sollen waeren dann
Java:
String sTMP6 = "abcde";

Sorry fuer den Doppelpost. Vielleicht sollte ich mich hier mal registrieren 🙂.
 
Sorry fuer den Doppelpost. Vielleicht sollte ich mich hier mal registrieren 🙂

Jau 😀

Also sollen diese hier alle matchen und alle weiteren mit mehr '|' nicht ???:L
Java:
"abcde"
"|abcde"
"abcde|"
"|abcde|"
"||abcde"
"||abcde|"
"||abcde||"

Dann doch eher so (lt. dem von mir genannten Tool 😀) :
Java:
^ [|]{0,2} ([a-zA-Z0-9])* [|]{0,2} $

Gruß
Klaus
 
So, angemeldet.
Code:
^[|]{0,2}([^|])*[|]{0,2}$
Das sollte es jetzt sein.
Danke fuer deine Hilfe.

EDIT: Viel Glueck in der zweiten Liga. Vielleicht sieht man sich ja mal auf dem Tivoli ;-)
 
Zuletzt bearbeitet:
ok, das geht auch, wobei Du in der Mitte halt ALLE anderen Zeichen außer '|' hast ...
Ich hatte es mal auf alle Buchstaben und Ziffern eingeschränkt ...

Gruß
Klaus
 
Es wird noch schlimmer (und aendert vermutlich alles):
"a|||bc|||de|" ist gueltig (und sogar explizit erwuenscht). Komplizierter wird es jetzt aber nicht mehr *hust*
Mit Sicherheit :lol:

Vielleicht solltest verbal formulieren, was alles matchen soll (und nicht anhand einzelner Beispiele) ...

Etwa so:
am Anfang und am Ende 0-2mal '|'
dazwischen beliebig viele "Buchstaben, Ziffern, was auch immer" mit "genau/bis zu 3 '|' ???:L" ....

Gruß
Klaus
 
Vielleicht solltest verbal formulieren, was alles matchen soll (und nicht anhand einzelner Beispiele) ...
Es handelt sich bei dem zu matchenden String um etwas, dass ich hinterher mit dem Splitter '|||' splitten moechte.
Der Splitter soll nicht am Anfang und nicht am Ende stehen (daher nur 0-2 mal '|' am Anfang oder Ende).
In der Mitte kann '|||' beliebig oft vorkommen (wenn es durch andere Zeichen getrennt ist), aber nichts, was mehr als drei '|' hat. '||||' (vier mal '|') waere also verboten.
 
Wenn man etwas "lookahead und lookbehind Magie" hinzufügt, scheint der folgende RegEx deinen Anforderungen zu entsprechen:
Code:
^[|]{0,2}([^|]|(?<!^)[|]{3}(?!(?:\||$)))+[|]{0,2}$
Habe dabei auch gleich mal den Regex Coach ausprobiert (nettes Programm) und den RegEx folgendermaßen getestet:
Code:
a|||bc|||abc|||               -> matcht nicht
abcbc|||bac|                  -> matcht
||abcbac|||bbaacc|||aabb      -> matcht
|aabbcc||abcabcabc||          -> matcht nicht
abc|||aabbcc|||bbccaa|||abcab -> matcht
|||abccba|||cbacba||          -> matcht nicht
|aabccc||||abccbabc||         -> matcht nicht
 
Zuletzt bearbeitet:
Wenn man etwas "lookahead und lookbehind Magie" hinzufügt, scheint der folgende RegEx deinen Anforderungen zu entsprechen:
Code:
^[|]{0,2}([^|]|(?<!^)[|]{3}(?!$))+[|]{0,2}$
Danke schoen.
Ich werde das mal auseinandernehmen und versuchen zu deuten:
Code:
^[|]{0,2}
Bis zu zwei || am Zeilenanfang.
Code:
([^|]|(?<!^)[|]{3}(?!$))+
Alles ausser | oder 3 | die nicht am Anfang und nicht am Ende stehen.
Das + dann fuer eins oder mehrere Zeichen.
Code:
[|]{0,2}$
Maximal 2 || am Ende der Zeile.

Das verbietet leider | in der Mitte die nicht drei Mal vorkommen, aber auf die kann ich verzichten, sonst wird es vermutlich noch viiiiel komplizierter.

EDIT:
Code:
^[|]{0,2}([^|]|(?<!^)[|]{1,3}(?!$))+[|]{0,2}$
funktioniert leider nicht um auch | und || in der Mitte abzudecken.
EDIT2:
Code:
^[|]{0,2}([^|]|(?<!^)[|]{3}(?!$)|(?<!^)[|]{2}(?!$)(?<!^)[|]{1}(?!$))+[|]{0,2}$
auch nicht
 
Zuletzt bearbeitet:
Habe meinen RegEx noch minimal erweitert (siehe auch Edit im vorherigen Beitrag):
Code:
^[|]{0,2}([^|]|(?<!^)[|]{3}(?!(?:\||$)))+[|]{0,2}$
Und zwar an der Stelle:
Code:
(?!(?:\||$))
Ohne diese Erweiterung würde nämlich auch das hier matchen:
Code:
abc||||||abc
Das verbietet leider | in der Mitte die nicht drei Mal vorkommen, aber auf die kann ich verzichten, sonst wird es vermutlich noch viiiiel komplizierter.
Ja, leider verbietet es wirklich '|' die weniger als 3 mal vorkommen, aber da wüsste ich dann auch nicht wie man den RegEx anpassen müsste, damit es dort auch matcht.

EDIT: Wobei... ich sehe gerade, das hier scheint zu funktionieren:
Code:
^[|]{0,2}([^|]|(?<!^)[|]{1,3}(?!(?:\||$)))+[|]{0,2}$
Müsste man mal noch weiter testen 🙂

EDIT 2: Ne, funktioniert nicht, da sowas hier dann matcht:
Code:
|||abc||abc
 
Zuletzt bearbeitet:
([^\\|])(\\|{1,3})([^\\|]+)(\\|{1,3})([^\\|])

group 0: gesamter String

group 1: ein Zeichen vor ein bis drei |-Zeichen
group 2: ein bis drei |-Zeichen
group 3: das, was eigentlich gewollt ist, und zwischen den |-Zeichen steht (*-Quantifier auch möglich)
group 4: ein bis drei |-Zeichen danach
group 5: ein Zeichen nach den letzten ein bis drei |-Zeichen

Anfang und Ende des Matcher-Strings müssen nochmal gesondert betratet werden, ein |-Zeichen muss es vorne und hinten immer geben, sonst würde das ganz keinen sinn machen.
 
Ich bin jetzt auf den hier gekommen:
Code:
^[|]{0,2}(?!\|)([^|]|(?<!^)[|]{1,3}(?!(?:\||$)))+[|]{0,2}$
Und die folgenden Tests deuten zumindest an, dass dieser korrekt sein könnte.
Code:
abc|abc||abc|||abc           -> matcht
||a|||abc|||abc|||abc|abc||  -> matcht
|||abc||abc                  -> matcht nicht
abc|abc||abc|||              -> matcht nicht
abc|abc||abc|||abc||         -> matcht
|abc|||abc|abc||abc|         -> matcht
||abc||||abc||               -> matcht nicht
abc|abc|abc                  -> matcht
||a|||b|c|                   -> matcht
Allerdings kann ich nicht garantieren, dass ich nicht doch irgendwas übersehen habe. 🙂
 

Neue Themen


Zurück
Oben