Laden...

Regex vereinfachen

Erstellt von martinO vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.646 Views
M
martinO Themenstarter:in
164 Beiträge seit 2009
vor 13 Jahren
Regex vereinfachen

Hallo zusammen

Ich hab hier eine regex zusammengekratzt, die das gewünschte Ergebnis liefert. Jedoch ist die Regex sehr "komplex" (und unschön).

Gibts eine einfachere Regex als die unten stehende für meine gewünschten Fälle?

[<]+(?!<translate>)|(?≤<translate>)[<]+(?=</translate>)|(?≤</translate>)[<]+(?=<translate>)|(?≤</translate>)[^<]+(?!<translate>)

(edit: "[<]+(?=<translate>)|" entfernt)

hallo => { hallo }
hallo <translate>du</translate> => { hallo , du }
<translate>du du</translate> => { du du }
hallo <translate> du</translate> halloo => { hallo, du, halloo }
hallo <translate> du</translate> halloo <translate>ich</translate> => { hallo, du, halloo , ich }
hallo <translate> du</translate> halloo <translate>ich</translate> ich => { hallo, du, halloo , ich, ich }

Merci im voraus

328 Beiträge seit 2006
vor 13 Jahren

Wäre es nicht einfacher alle <translate> und </translate> durch "nichts" zu ersetzen (und dann nach einem Leerzeichen splitten)?

Träume nicht dein Leben sondern lebe deinen Traum.
Viele Grüße, David Teck

M
martinO Themenstarter:in
164 Beiträge seit 2009
vor 13 Jahren

Ja, aber eine Info habe ich euch vorenthalten:
Leerzeichen müssen erhalten bleiben (beispiel 3).

(später muss ich herausfinden, ob der string zwischen translate gestanden hat oder nicht - dazu mache ich eine zweite regex die nur diese matches rausfiltert und dann vergleiche ich die beiden listen)

EDIT: die bis jetzt einfachste Lösung:
[<]+(?!<<translate>)|(?≤<translate>)[<]+(?=</translate>)|(?≤</translate>)[<]+(?!</translate>)

(und im Code verständlich:

                const string FirstMatch = "^[^<]+(?!<<translate>)";
                const string TranslatedMatch = "(?<=<translate>)[^<]+(?=</translate>)";
                const string BetweenTranslatedElementsOrLastMatch = "(?<=</translate>)[^<]+(?!</translate>)";

                const string AllPattern = FirstMatch + "|" + TranslatedMatch + "|" + BetweenTranslatedElementsOrLastMatch;
49.485 Beiträge seit 2005
vor 13 Jahren

Hallo martinO,

so wie ich es verstehe, willst du:

(?≤</?translate>|)[<]+(?=</?translate>|$)

Das ist zwar nicht ganz akkurat, weil der Pattern auch auf einen Text zwischen <translate> und <translate> bzw. zwischen </translate> und </translate> passen würde, aber wenn solche Konstellationen im Input-String nicht vorkommen können, ist es ja auch egal, ob der Pattern darauf passt oder nicht.

herbivore

M
martinO Themenstarter:in
164 Beiträge seit 2009
vor 13 Jahren

Vielen Dank Herbivore - alle Unit-Tests erfolgreich durchgelaufen. Genial!

328 Beiträge seit 2006
vor 13 Jahren

Folgender wäre kürzer:

(?≤</?translate>|^)(\s*\w+\s*)+

Träume nicht dein Leben sondern lebe deinen Traum.
Viele Grüße, David Teck

M
martinO Themenstarter:in
164 Beiträge seit 2009
vor 13 Jahren

Hallo TripleX

Also ich hab deine Regex mal in herbivore's Tool regexlab eingefügt und es hat nicht den gewünschten Output gegeben. Aber trotzdem vielen Dank für den Input

328 Beiträge seit 2006
vor 13 Jahren

Hm also ich habe alle deine strings aus dem 1sten Beitrag ausprobiert und diese haben mir das richtige Ergebnis ausgespuckt. Nichtsdestotrotz entschuldige ich mich dafür 😉

Träume nicht dein Leben sondern lebe deinen Traum.
Viele Grüße, David Teck