Regex: Alternation in Lookbehind

Status
Nicht offen für weitere Antworten.

tm001

Mitglied
Hallo,
ich stoße gerade auf folgendes Problem beim Umgang mit regulären Ausdrücken:

In Alternationen, wie "(a|ab|b)" geht die Engine normalerweise so vor, dass der erste matchende Ausdruck zuschlägt und alle anderen nicht mehr betrachtet werden (hier: wenn a matcht, wird ab nicht betrachtet). Das ist auch das Verhalten, was ich haben möchte. Dies scheint in einer Lookbehind-Gruppe anders zu sein. Folgendes Beispiel:

(?<=(Hello World|World))\s\d{4}

Ich suche alle vierstelligen Zahlen, denen entweder "World" oder "Hello World" vorangestellt ist. Welcher Ausdruck nun davor stand, möchte ich durch Abfrage der ersten Gruppe erfragen. In folgendem Text wird jedoch nicht "Hello World", wie ich es erwartet habe, sondern "World" durch die Gruppe gematcht:

Hello World 2000

Offenbar wird also im Lookbehind nicht nach der Reihenfolge vorgegangen, sondern nach der Länge. Ich möchte jedoch nicht den kürzesten möglichen Ausdruck finden, sondern den längsten (deswegen hatte ich die Alternation extra absteigend nach Länge sortiert).

Irgendeine Idee?

PS: Ich verwende Java 6
 
Zuletzt bearbeitet:

fjord

Bekanntes Mitglied
Warum willst du überhaupt ein Lookbehind benutzen?
mach doch einfach:
Code:
((?:Hello )?World)\s\d{4}

/edit: "negativ" entfernt.
 
Zuletzt bearbeitet:

tm001

Mitglied
In wirklichkeit ist der ausdruck und die anwendung deutlich komplizierter, ich brauche dafür in jedem fall ein lookbehind (btw. das ist ein positiver lookbehind, nicht negativ).

Ich hab das bsp nur aufs wesentliche reduziert, um die Problemstellung zu verdeutlichen, sonst verwirrt das drumrum viel zu sehr.
 

Ark

Top Contributor
Ich sehe das auch so wie fjord. Du müsstest uns schon den gesamten Ausdruck zeigen, denke ich.

Ark
 

fjord

Bekanntes Mitglied
Du hast natürlich recht mit dem negativ. Weiß nicht woran ich da beim Schreiben gedacht hab. ???:L

An dem Beispiel lässt sich das jetzt schlecht sagen. Soweit ich weiß, darf in einem Lookbehind nur Plaintext mit Alternation drin sein, so dass man da nicht viel machen kann.
 

tm001

Mitglied
Was würde denn der komplette Ausdruck hier helfen? Das Problem tritt doch auch bei diesem kleinen Ausdruck auf, oder bei euch nicht?

Sollte das ganze grundsätzlich nicht gehen, müsste ich mir einen anderen Lösungsweg suchen, das wäre dann aber der worst case.

"Soweit ich weiß, darf in einem Lookbehind nur Plaintext mit Alternation drin sein, so dass man da nicht viel machen kann. "

Was meinst du mit Plaintext? Ich hab doch in dem lookbehind nur eine Alternation drin, mehr nicht. Soweit ich weiß, ist die einzige Beschränkung, dass die maximallänge der lookbehind-gruppe bekannt sein muss, es sind also keine "+" oder "*" quantoren erlaubt.
 

fjord

Bekanntes Mitglied
Mit Plaintext meine ich genau das was du gemacht hast. Ich wollte damit nur zum Ausdruck bringen, dass man das von dir genannte Problem nicht durch eine regex im Lookbehind versuchen kann zu umgehen.

Der komplette Ausdruck würde vielleicht bringen, dass jemand eine Idee hat wie man auf den Lookbehind verzichten kann, denn ich wüsste nicht, wie man das Problem mit Lookbehind lösen sollte.
 

tm001

Mitglied
Siehe folgende Seite:

Regex Tutorial - Lookahead and Lookbehind Zero-Width Assertions

Dort steht bei "Important Notes About Lookbehind":

"Therefore, many regex flavors, including those used by Perl and Python, only allow fixed-length strings. You can use any regex of which the length of the match can be predetermined. This means you can use literal text and character classes. You cannot use repetition or optional items. You can use alternation, but only if all options in the alternation have the same length.

Some regex flavors, like PCRE and Java support the above, plus alternation with strings of different lengths. Each part of the alternation must still have a finite maximum length. This means you can still not use the star or plus, but you can use the question mark and the curly braces with the max parameter specified. These regex flavors recognize the fact that finite repetition can be rewritten as an alternation of strings with different, but fixed lengths."

Grundsätzlich ist also das, was ich versuche, erlaubt. Nur scheint das Matchingverhalten bei Alternationen von Java in Lookbehind-Gruppen nicht dem (auch in Java) üblichen Verhalten bei Alternationen außerhalb von Lookbehind-Gruppen zu entsprechen. Das scheint mir eher ein Bug von Java zu sein.
 

fjord

Bekanntes Mitglied
Ich wollte auch überhaupt nicht andeuten, dass das was du machst nicht erlaubt ist, es führt ja nur nicht zum gewünschten Ergebnis.
Das in einem lookbehind lediglich die quantifier nicht erlaubt sind ist mir neu, in meiner Quelle stand es dann wohl etwas ungünstig formuliert, ist aber gut zu wissen.

Ich fürchte aber, dass das was du willst, so nicht möglich ist.
 

tm001

Mitglied
die befürchtung habe ich auch, aber ich hätte halt gerne gewissheit... :)

btw. was erlaubt ist und was nicht, hängt offenbar auch von der engine ab. es gibt welche, die quantifier erlauben, aber java halt nicht.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Frage regex greater than less than Allgemeine Java-Themen 7
N Regex schlägt nicht an Allgemeine Java-Themen 10
W Variable Initialisierung mit dem Ergebnis einer Regex Allgemeine Java-Themen 1
T regex case insensitive trimmed Allgemeine Java-Themen 6
S Zeichen | in regex Allgemeine Java-Themen 8
X Regex mit mehreren Bedingungen machen Allgemeine Java-Themen 5
N Hilfe bei RegEx benötigt Allgemeine Java-Themen 3
C Java17 und Regex Allgemeine Java-Themen 13
OnDemand RegEx /compilebekomme nicht die erwarteten Werte Allgemeine Java-Themen 9
N Gierigen Regex in nicht-gierigen umwandeln Allgemeine Java-Themen 4
N E-Mail Validator (ohne Regex!) Allgemeine Java-Themen 7
OnDemand Regex von bis Allgemeine Java-Themen 6
W Versionsnummer auslesen - Regex ist zickig Allgemeine Java-Themen 2
L RegEx für Teile einer Berechnung Allgemeine Java-Themen 14
G Regex Allgemeine Java-Themen 2
L regex ganzer string? Allgemeine Java-Themen 2
MiMa Geldbetrag mit regex ermitteln. Allgemeine Java-Themen 14
W RegEx Stringliteral finden - Jflex Allgemeine Java-Themen 5
D Regex Probleme Allgemeine Java-Themen 2
Kirby.exe Regex charakter ignorieren Allgemeine Java-Themen 12
S Java SAT (Haltbarkeitsproblem) mit Regex Allgemeine Java-Themen 6
S [Regex] Nur diese Zeichen beachten Allgemeine Java-Themen 1
M Bitte Hilfe mit REGEX (Negieren) Allgemeine Java-Themen 4
J Compilerfehler bis in java.util.regex.Pattern... Allgemeine Java-Themen 2
C PDFBox: Nach RegEx ganze Zeile Allgemeine Java-Themen 4
S Regex mit UND-Verknüpfung Allgemeine Java-Themen 1
P RegEx für Zeiten Allgemeine Java-Themen 7
D Regex: Komplettes Wort bekommen Allgemeine Java-Themen 3
Neumi5694 Operatoren regEx für das Erstellen eines Strings verwenden Allgemeine Java-Themen 3
P RegEx Allgemeine Java-Themen 3
W String Parsen und auf eigenes Muster anwenden (kein Regex) Allgemeine Java-Themen 11
Y regex | n-faches Vorkommen oder gar keins Allgemeine Java-Themen 6
turmaline Regex gegen Regex prüfen Allgemeine Java-Themen 4
HarleyDavidson Regex - Optimierung Allgemeine Java-Themen 4
M Regex für Zahleneingabe in JavaFX Textfield Allgemeine Java-Themen 18
T Best Practice Wortregeln RegEx Allgemeine Java-Themen 11
A ALTER TABLE mit Hilfe von RegEx zerlegen, splitten Allgemeine Java-Themen 5
H Interpreter-Fehler Regex kompiliert nicht Allgemeine Java-Themen 5
M RegEx alle Matches ausgeben Allgemeine Java-Themen 5
Iron Monkey Mit Regex nach Beträge suchen Allgemeine Java-Themen 4
T REGEX Erklaerung Allgemeine Java-Themen 14
T Nur innerhalb des regex-Match ersetzen Allgemeine Java-Themen 9
H Pic Download / Regex Problem Allgemeine Java-Themen 7
F Frage zu Regex möglich Allgemeine Java-Themen 4
M Regex... mal wieder Allgemeine Java-Themen 3
H RegEx - Ersetze alles bis Leerzeichen Allgemeine Java-Themen 5
S regex verbrät CPU Allgemeine Java-Themen 6
V Regex Bereichs Filter Allgemeine Java-Themen 4
127.0.0.1 RegEx _ und 0-9 Allgemeine Java-Themen 45
S Entfernen von allen Nicht-Buchstaben chars aus einem String ohne Regex..? Allgemeine Java-Themen 10
P Java String Regex Allgemeine Java-Themen 2
AyKay Regex XPath Allgemeine Java-Themen 4
C Regex (Case insensitive und Umlaute) Allgemeine Java-Themen 4
D Regex Raute erkennen Allgemeine Java-Themen 2
nrg Zweistelligen Zahlenbereich mit RegEx Allgemeine Java-Themen 8
GilbertGrape Regex-Problem Allgemeine Java-Themen 2
W Denkblockade RegEx Allgemeine Java-Themen 2
S eigene regEx schreiben Allgemeine Java-Themen 4
C Regex expandieren Allgemeine Java-Themen 6
C Regex Überschniedung von Ausdrücken Allgemeine Java-Themen 16
reibi RegEX - Teilstring Allgemeine Java-Themen 6
R Java-RegEx terminiert nicht Allgemeine Java-Themen 3
M Regex: Ich stehe auf dem Schlauch Allgemeine Java-Themen 2
V Kleines Regex-Problem Allgemeine Java-Themen 3
B Regex "Problem" Allgemeine Java-Themen 4
B RegEx: (Um-)formulieren eines Pattern zur Identifizierung komplexer URLs Allgemeine Java-Themen 7
P RegEx mit HTML Parser für Java möglich? Allgemeine Java-Themen 10
J Regex: Fertige URLS aus Javascript Allgemeine Java-Themen 3
N Java regex Allgemeine Java-Themen 5
K Regex JSON Allgemeine Java-Themen 3
J RegEx Ausdruck Allgemeine Java-Themen 2
J Regex: URLS aus CSS Allgemeine Java-Themen 2
G RegEx- Ausdruck Allgemeine Java-Themen 4
G RegEx kein Unterstrich Allgemeine Java-Themen 2
A Text via RegEx durchsuchen und teile ersetzten Allgemeine Java-Themen 5
C Regex: Zahl ohne führende Null Allgemeine Java-Themen 13
W RegEx Zeile parsen Medium Allgemeine Java-Themen 8
X Java String Regex - Sonderzeichen Filtern Allgemeine Java-Themen 5
S Dateiname mit Regex parsen Allgemeine Java-Themen 3
Loyd Noch ne Regex-Frage: Verschachtelte Ausdrücke Allgemeine Java-Themen 4
R Java Regex Frage Allgemeine Java-Themen 17
Daniel_L RegEx-Frage: Ersetzen in UBB ausschließen Allgemeine Java-Themen 2
M Große Datei mit Regex durchsuchen Allgemeine Java-Themen 4
S regex für einen Link Allgemeine Java-Themen 3
E Regex alles nach ? löschen Allgemeine Java-Themen 4
M RegEx-Frage Allgemeine Java-Themen 2
R Regex Tokenizer Allgemeine Java-Themen 11
E Regex HTML Tag und Inhalt löschen Allgemeine Java-Themen 4
H RegEX und eMail Allgemeine Java-Themen 4
L-ectron-X Regex zum Entfernen von mehrzeiligen Kommentaren Allgemeine Java-Themen 2
martin82 Regex - JTable - Filter Allgemeine Java-Themen 10
nrg Kleine Hilfe mit RegEx Allgemeine Java-Themen 2
B Regex-Fehler nach lib-Update Allgemeine Java-Themen 2
K Contrains oder Regex Allgemeine Java-Themen 3
J replaceAll , "[", "]" & regex Allgemeine Java-Themen 12
P RegEx und $-Zeichen als Literal Allgemeine Java-Themen 5
P RegEx - Worte ausschließen Allgemeine Java-Themen 8
S Regex - was isst denn {javaLetter} und {javaDigit}? Allgemeine Java-Themen 2
D Wie werden Regex-Gruppen kompiliert? Allgemeine Java-Themen 2
Stillmatic RegEx Matches ausgeben Allgemeine Java-Themen 10

Ähnliche Java Themen

Neue Themen


Oben