Entwickler-Ecke
Basistechnologien - Regex mit Multiline zu gierig
Trashkid2000 - Sa 02.07.11 22:44
Titel: Regex mit Multiline zu gierig
Hallo liebes Forum,
habe da ein Problem mit einem regulären Ausdruck, wo ich nicht so recht weiterkomme.
Also, ich habe da eine HTML-Datei (eigentlich mehrere), die geändert werden sollen. Also manche Stellen ersetzen, ganz löschen, ...
Habe in den Dateien z.B. mehere span-Tags, die entfernt werden müssen. Die Tags sehen so aus:
Quelltext
1:
| <span style='font-size:1.0pt;font-family:ZWAdobeF;color:windowtext;'>T</span> |
So, nun ist aber das große Problem, dass innerhalb des Tags Zeilenumbrüche vorkommen können.
Also z.B. vor style-Angabe oder irgendwo danach.
Habe nun erstemal diesen Ausdruck:
C#-Quelltext
1:
| @"\<span[\s\S]*?style[\s\S]*?\>T\</span\>" |
Nun ist aber das Problen, das der Ausdruck zu gierig ist, ich bei den Matches also manchmal gleich mehrer span-Tags mit drin habe. Was ich nicht verstehe, da ich doch überall den "?"-Quantor angegeben habe.
Sitze echt schon sehr lange, den Ausdruck gebacken zu bekommen.
Wäre echt für jede Hilfe dankbar.
LG
Kha - So 03.07.11 00:36
Hast du einen Beispieltext, bei dem der Regex zu gierig ist?
Trashkid2000 - So 03.07.11 10:04
Hallo,
erstmal Danke für die Antwort.
Stimmt, ein paar Beispiele sind auf jeden Fall sinnvoll.
Hier also mal ein paar davon. Die Zeilenumbrüche wurden so aus dem Originaltext bzw aus dem Match übernommen.
Ausschnitt aus Originaltext:
Quelltext
1: 2:
| <p class='MsoList' style='text-autospace:ideograph-numeric'><span style='font-family:Symbol;'>·</span> <span style='font-size:1.0pt;font-family:ZWAdobeF'>T</span><span class= |
resultierender Match:
Quelltext
1: 2:
| <span style='font-family:Symbol;'>·</span> <span style='font-size:1.0pt;font-family:ZWAdobeF'>T</span> |
Ausschnitt aus Originaltext:
Quelltext
1: 2: 3: 4: 5:
| <span class='ICD10FettChar'>A21.0</span><span class='ICD10FettChar'><span style='font-size:1.0pt;font-family:ZWAdobeF; color:windowtext'>T</span></span> Ulzeroglanduläre Tularämie</p> |
resultierender Match:
Quelltext
1: 2: 3:
| <span class='ICD10FettChar'>A21.0</span><span class='ICD10FettChar'><span style='font-size:1.0pt;font-family:ZWAdobeF;color:windowtext;'>T</span> |
Ausschnitt aus Originaltext:
Quelltext
1: 2:
| (<span style='font-size:1.0pt;font-family:ZWAdobeF'>X</span>Fieber<span style='font-size:1.0pt; font-family:ZWAdobeF'>X</span> <span style='font-size:1.0pt;font-family:ZWAdobeF'>T</span><span class='ListeFettKapitlchenChar'> |
resultierender Match:
Quelltext
1: 2:
| <span style='font-size:1.0pt;font-family:ZWAdobeF'>X</span>Fieber<span style='font-size:1.0pt; font-family:ZWAdobeF'>X</span> <span style='font-size:1.0pt;font-family:ZWAdobeF'>T</span> |
Mir kommt es so vor, als ob der Ausdruck zu gierig ist, wenn mehr als ein Zeilenumbruch zwischen anfangendes und endendes span-Tag liegen.
Bin echt dankbar für jede Hilfe.
LG
Kha - So 03.07.11 11:27
Ah, auf ein span mit dem falschen Inhalt folgt eines mit dem richtigen, dann macht das schon Sinn :idea: . Denn *? wird dir zwar einen kürzest möglichen Match produzieren, aber immer noch erstmal den linkest möglichen ;) . Du solltest also erst einmal nach dem span suchen und dann erst, ohne Backtracking, den Inhalt überprüfen:
Quelltext
1:
| (?><span[\s\S]*?style[\s\S]*?>)T</span> |
Generell ist aber .*? nie optimal, da es eben gern zwei Teile zusammen matcht, wenn in einem auch nur der kleinste Mismatch passiert. Robuster ist es auf jeden Fall, eine komplette nicht-backtrackende "Grammatik" aufzustellen, wenn man den Aufbau des Inputs wirklich exakt kennt:
Quelltext
1:
| <span\s*style='[^']*'\s*>T</span> |
Trashkid2000 - So 03.07.11 11:59
Hallo
Kha,
vielen Dank für Deine gute Erklärung, und vor allem für den passenden reg. Ausdruck. Und das so schnell.
Der 2. von Dir gepostete ist perfekt. Das hilft mir wirklich sehr weiter.
Muss zugeben, dass ich mit reg. Ausdrücken so meine Problemchen habe (weil ich erstens nicht die gesamte Syntax im Kopf habe, und mir zweitens auch einfach das Verständnis fehlt) :(
Vielen Dank nochmal und schönen Sonntag noch,
LG
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!