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
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
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;
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
Vielen Dank Herbivore - alle Unit-Tests erfolgreich durchgelaufen. Genial!
Folgender wäre kürzer:
(?≤</?translate>|^)(\s*\w+\s*)+
Träume nicht dein Leben sondern lebe deinen Traum.
Viele Grüße, David Teck
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
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