mikrocontroller.net

Forum: PC-Programmierung REGEX Frage zur Ermittlung einer Zeichenkette


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Frank L. (Firma: Flk Consulting UG) (flk)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.
\[<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

Autor: Klakx (Gast)
Datum:

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

Autor: DPA (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
\[<a(\s+[a-zA-Z\-][a-zA-Z0-9\-]*(=("[^"]*"|'[^']*'|[a-zA-Z0-9\-_]+)?)?)*\s*>([^<]*|<[^a]|<a[^ >])+</a\s*>\]

Autor: Frank L. (Firma: Flk Consulting UG) (flk)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: DPA (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: DPA (Gast)
Datum:

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

Autor: Frank L. (Firma: Flk Consulting UG) (flk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank L. (Firma: Flk Consulting UG) (flk)
Datum:

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

Gruß
Frank

Autor: DPA (Gast)
Datum:

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

Aber nur bei der letzten Version:
\[<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[^ >])+".

Autor: Frank L. (Firma: Flk Consulting UG) (flk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo DPA (Gast),

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

Gruß
Frank

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.