Forum: PC-Programmierung REGEX Frage zur Ermittlung einer Zeichenkette


von Frank L. (Firma: Flk Consulting UG) (flk)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen,
ich stehe hier vor einem kleinem RegEx Problem.

Aufgabenstellung:
Wir führen eine Migration von Lotus-Notes nach SharePoint durch. Da in 
Lotus-Notes alles mögliche in ein Textfeld gepastet werden kann, stehen 
wir vor dem Problem, die Urls die sich in den Textbody befinden zu 
analysieren und entsprechend unserer Logik anzupassen.


Beim Export werden alle Dokumente die in so einem Textbody erwähnt 
werden als Attachment an den Datensatz angehangen. Diese Attachments 
werden von mir durch iteriert und ich versuche die Entsprechungen im 
Textbody zu finden und anzupassen.

Folgendes Problem tritt auf:

In einigen Namen tauchen spezielle Sonderzeichen auf, die ich in meinem 
RegEx mit "\S" berücksichtigen muss.

Jetzt tritt das Problem auf, dass der RegEx die Matches nicht immer 
eindeutig identifizieren kann und Treffer die einzeln stehen sollen zu 
einem Treffer zusammengezogen werden.

Ich habe versucht das Ganze an zwei Bilder zu verdeutlichen.

Bild1 zeigt das gewünschte Verhalten, es werden zwei Matches gefunden.
Bild2 zeigt das fehlerhafte Verhalten, es erden zwei Matches an Stelle 
von drei Matches gefunden.

Hier das von mir verwendete RegEx.
1
\[<a [a-z|A-Z|ä|Ä|ö|Ö|ü|Ü|~|=|"|(|)|&|#|;|,|!|ß| |_|.|0-9|\/>|%|-|\S]*<\/a>\]

Die zu ermittelnden Ausdrücke müßt Ihr aus den Bilder entnehmen, da ich 
diese hier nicht posten kann wegen Spam Meldung.

Wahrscheinlich kann man den Ausdruck noch kürzer formulieren, im Monent 
geht es mir nur darum den Fehler aus Bild2 zu eleminieren.

Gruß und Danke
Frank

von Klakx (Gast)


Lesenswert?

Für komplizierte Ausdrücke fand ich https://www.debuggex.com hilfreich. 
Dies stellt deine Eingabe dar.

von DPA (Gast)


Lesenswert?

Nunja, du matchst zwischendrin ja auch so ziemlich alles, mit dem . 
eigentlich ganz alles, deshalb endet es nach dem </ a>] nicht.

Ich würde das eher so formulieren, um alle a tags in [] klammern zu 
finden:
1
\[<a(\s+[a-zA-Z\-][a-zA-Z0-9\-]*(=("[^"]*"|'[^']*'|[a-zA-Z0-9\-_]+)?)?)*\s*>([^<]*|<[^a]|<a[^ >])+</a\s*>\]

von Frank L. (Firma: Flk Consulting UG) (flk)


Angehängte Dateien:

Lesenswert?

DPA schrieb:
> Ich würde das eher so formulieren, um alle a tags in [] klammern zu
> finden:\[<a(\s+[a-zA-Z\-][a-zA-Z0-9\-]*(=("[^"]*"|'[^']*'|[a-zA-Z0-9\-_] 
+)?)?)*\s*>([^<]*|<[^a]|<a[^
>>])+</a\s*>\]

Hallo,
funktioniert leider gar nicht.

ich verwende diese Seite "https://regex101.com";

Im Anhang mal die beiden Ausgangssituationen.

Gruß
Frank

von DPA (Gast)


Lesenswert?

Frank L. schrieb:
> DPA schrieb:
>> Ich würde das eher so formulieren, um alle a tags in [] klammern zu
>> finden:\[<a(\s+[a-zA-Z\-][a-zA-Z0-9\-]*(=("[^"]*"|'[^']*'|[a-zA-Z0-9\-_]
> +)?)?)*\s*>([^<]*|<[^a]|<a[^
>>>])+</a\s*>\]
>
> Hallo,
> funktioniert leider gar nicht.

Funktioniert doch ganz gut:
https://regex101.com/r/34Fyvg/1/

Nur den / musste man bei diesem noch escapen.

von DPA (Gast)


Lesenswert?

Edit: Bei JS kahm es manchmal noch zu einem Timeout. Hier die geupdatete 
Version:
https://regex101.com/r/34Fyvg/2/

von Frank L. (Firma: Flk Consulting UG) (flk)


Lesenswert?

DPA schrieb:
> Funktioniert doch ganz gut:
> https://regex101.com/r/34Fyvg/1/
>
> Nur den / musste man bei diesem noch escapen.

Sorry, mein Fehler ich vergaß zu sagen, dass das mit Javascript geparst 
wird :-(

mit dem PHP Parser klappt es tatsächlich gut.

Gruß
Frank

von Frank L. (Firma: Flk Consulting UG) (flk)


Lesenswert?

Ich nehme alles zurück, es klappt mit beiden Parsern. Ich habe das jetzt 
mal in mein Programm eingebunden.

Gruß
Frank

von DPA (Gast)


Lesenswert?

Frank L. schrieb:
> Ich nehme alles zurück, es klappt mit beiden Parsern.

Aber nur bei der letzten Version:
1
\[<a(\s+[a-zA-Z\-][a-zA-Z0-9\-]*(=("[^"]*"|'[^']*'|[a-zA-Z0-9\-_]+)?)?)*\s*>([^<]|<[^a]|<a[^ >])+<\/a\s*>\]

Das Problem war, dass der Abschnitt "([^<]*|<[^a]|<a[^ >])+" zu endlosem 
Backtracking führte, weil bei beliebig vielen [^<]* das <[^a] durch das 
+ ständig abwechselnd probiert wurden, womit die Zeit die das brauchte 
exponentiell wuchs. Durch das herausnehmen des ohnehin unnötigen * 
konnte ich das beheben "([^<]|<[^a]|<a[^ >])+".

von Frank L. (Firma: Flk Consulting UG) (flk)


Lesenswert?

Hallo DPA (Gast),

danke für Deine Hilfe, jetzt klappt alles wie gewünscht.

Gruß
Frank

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.