Autor Beitrag
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Sa 02.07.11 22:44 
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:
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: So 03.07.11 00:36 
Hast du einen Beispieltext, bei dem der Regex zu gierig ist?

_________________
>λ=
Trashkid2000 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: 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:
ausblenden 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:
ausblenden Quelltext
1:
2:
<span
style='font-family:Symbol;'>·</span>  <span style='font-size:1.0pt;font-family:ZWAdobeF'>T</span>

Ausschnitt aus Originaltext:
ausblenden 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:
ausblenden 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:
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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:
ausblenden 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:
ausblenden Quelltext
1:
<span\s*style='[^']*'\s*>T</span>					

_________________
>λ=

Für diesen Beitrag haben gedankt: Trashkid2000
Trashkid2000 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: So 03.07.11 11:59 
Hallo user profile iconKha,
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