Laden...

Regex Teil optional machen

Erstellt von filmee24 vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.102 Views
F
filmee24 Themenstarter:in
51 Beiträge seit 2011
vor 9 Jahren
Regex Teil optional machen

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

49.485 Beiträge seit 2005
vor 9 Jahren

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

F
filmee24 Themenstarter:in
51 Beiträge seit 2011
vor 9 Jahren

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

F
filmee24 Themenstarter:in
51 Beiträge seit 2011
vor 9 Jahren

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

16.842 Beiträge seit 2008
vor 9 Jahren

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.

49.485 Beiträge seit 2005
vor 9 Jahren

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