Hallo,
ich habe einen langen Regex-Pattern.
Leider blicke ich da nicht mehr so ganz durch.
Es soll machen, dass href='irgendwas' alles nach href optional ist.
Pattern:
\\b([a-zA-Z][a-zA-Z_0-9]*)\\s*=\\s*(\"([\\w\\s\'.,?/\\:;!@#$%^&*()=\\-\\+\\^\\{\\}\\[\\]~]*)\"|\'([\\w\\s\".,?/\\:;!@#$%^&*()=\\-\\+\\^\\{\\}\\[\\]~]*)\'|([\\w.,?/\\:;!@#$%^&*()=\\-\\+\\^\\{\\}\\[\\]~]*))
Ich hoffe ihr könnt mir helfen
Vielen Dank
C. Anders
Hallo filmee24,
man kann einen beliebigen Teil eines Patterns optional machen, indem man ihn in Klammern setzt und hinter die schließende Klammer ein Fragezeichen schreibt, z.B.
fest1(optional)?fest2
Das steht aber in jeder Regex-Anleitung, z.B. [Artikel] Regex-Tutorial. (Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1.
Wenn dir Übersicht in einem längeren Pattern flöten geht, kannst du ihn auch durch Leerzeichen und Zeilenumbrüche gliedern und sogar Kommentare einfügen und dies alles dann mit RegexOptions.IgnorePatternWhitespace ignorieren.
Statt deinen länglichen Gruppen von erlaubten Zeichen kannst du in der Praxis einfach [>] verwenden, oder ["] oder [^">] oder welche Zeichen auch immer gerade unbedingt ausgeschlossen werden müssen. Siehe dazu auch RegEx kürzester Match [und die Gefahren von .*?].
Testen kannst du deinen Pattern z.B. mit On-the-fly Regex-Tester: Regex-Lab.
herbivore
wenn ich das pattern teste finde er kein ergebnis, aber in c# geht alles 😭
könntest du dir den Pattern nicht am Ende genau ansehen, ich muss ja nur wissen wo ich mit der Gruppe anfangen und wo enden muss
C. Anders
ich habe einen anderen pattern gefunden:
(\S+)=["']?((?:.(?!["']?\s+(?:\S+)=|[>"']))+.)["']?
wenn ich alles nach = optional mache:
(\S+)(=[""']?((?:.(?![""']?)?\s+(?:\S+)(=|[>""']))+.)[""']?)?
jetzt findet er aber kein attribute
C. Anders
Ich empfehl Dir das freie Tool Expresso
. Dort siehst Du welcher Pattern teil greift, bzw. warum er nicht greift.
Ansonsten: das Forum ist kein Pattern-Generator. Und, dass Regex-Pattern manchmal nicht sofort greifen, weil kompliziert, ist normal.
Es ist (oft) auch einfacher Pattern neu zu schreiben, statt vorhandene zu editieren.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hallo filmee24,
ich muss ja nur wissen wo ich mit der Gruppe anfangen und wo enden muss
ich kann mich Abt nur anschließen und noch ergänzen, dass wenn man einen Pattern erstellt hat, der auf das gesamte Tag matcht, es ein leichtes sein sollte, den Teil zu identifizieren, den man optional machen will. Zudem kannst du in Regex-Lab einen beliebigen Teil des Pattern einfach testweise in runde Klammern setzen (natürlich so, dass der Pattern anschließend noch syntaktisch korrekt ist) und siehst dann an der Einfärbung sofort, auf welchen Teil des Inputs dieser Teil des Pattern match. Wenn das zu viel oder zu wenig ist, verschiebe die testweise gesetzten Klammern einfach entsprechend weiter nach vorne und/oder hinten.
wenn ich das pattern teste finde er kein ergebnis, aber in c# geht alles
Beim Kopieren eines Patterns aus Regex-Lab in den C# Quellcode muss man aufpassen, dass man den String richtig escaped. Im Normalfall ist es am besten, den Pattern mit @""
zu umschließen, siehe [FAQ] Was bedeutet das @ (=at) vor String-Literalen? Und: Wissenswertes zu Escape-Sequenzen. Dann muss man allerdings evtl. enthaltene Anführungszeichen doppeln. Umschließt man den String nur mit ""
, dann muss man insbesondere alle Backslashes doppeln, was im Normalfall häufiger vorkommt und deshalb mehr Aufwand ist. In die andere Richtung, also vom Code nach Regex-Lab, muss man es natürlich genau andersherum machen.
herbivore