Regelmäßige Ausdrücke lernen [geschlossen]

  • Ich verstehe reguläre Ausdrücke nicht wirklich. Kannst du sie mir auf leicht verständliche Weise erklären? Wenn es Online-Tools oder Bücher gibt, können Sie auch auf sie verlinken?

    07 January 2015
    Keks Dose
1 answer
  • Der wichtigste Teil sind die Konzepte. Wenn Sie erst einmal verstanden haben, wie die Bausteine ​​funktionieren, sind Unterschiede in der Syntax kaum mehr als milde Dialekte. Eine Ebene über der Syntax Ihrer regulären Ausdrucks-Engine ist die Syntax der verwendeten Programmiersprache. Sprachen wie Perl beseitigen die meisten dieser Komplikationen, aber Sie müssen andere Überlegungen berücksichtigen, wenn Sie reguläre Ausdrücke in einem C-Programm verwenden.

    Wenn Sie an Folgendes denken reguläre Ausdrücke als Bausteine, die Sie beliebig mischen können, hilft Ihnen dabei, zu lernen, wie Sie eigene Muster schreiben und debuggen, aber auch Muster verstehen, die von anderen geschrieben wurden.

    Einfach starten

    Konzeptionell sind die einfachsten regulären Ausdrücke Literalzeichen. Das Muster N stimmt mit dem Zeichen 'N' überein.

    Reguläre Ausdrücke nebeneinander passen zu Sequenzen. Beispielsweise stimmt das Muster Nick mit der Folge 'N', gefolgt von 'i', gefolgt von 'c', gefolgt von 'k' überein.

    Wenn Sie jemals grep unter Unix - auch wenn Sie nur nach normal aussehenden Zeichenketten suchen - Sie haben bereits reguläre Ausdrücke verwendet! (The re in grep bezieht sich auf reguläre Ausdrücke.)

    Reihenfolge im Menü

    Hinzufügen nur ein wenig Bei der Komplexität können Sie entweder 'Nick' oder 'Nick' mit dem patt ern [Nn]ick abgleichen. Bei dem in eckigen Klammern stehenden Teil handelt es sich um eine Zeichenklasse , das heißt, es stimmt genau mit einem der eingeschlossenen Zeichen überein. Sie können auch Bereiche in Zeichenklassen verwenden. so [a-c] stimmt entweder mit 'a' oder 'b' oder 'c' überein.

    Das Patt ern . ist speziell : anstatt nur einen literalen Punkt zu finden, stimmt er mit jedem Zeichen überein. Es ist das gleiche Konzept wie das wirklich große Zeichen class [-.?+%$A-Za-z0-9...]< / code>.

    Stellen Sie sich Zeichenklassen als Menüs vor: Wählen Sie nur eine aus.

    Hilfreiche Verknüpfungen

    Using .< / code> können Sie speichernSie schreiben viel, und es gibt noch andere Tastenkombinationen für gängige Muster. Angenommen, Sie möchten nicht negative ganze Zahlen abgleichen: Eine Möglichkeit, den at is [0-9]+< / code> zu schreiben. Ziffern sind ein häufiges Übereinstimmungsziel. Sie können also d use \d+< / code> verwenden, um nicht negative ganze Zahlen abzugleichen. Andere s are \s< / code> (Leerzeichen ) and \w< / code> (Wortzeichen: alphanumerische Zeichen oder Unterstrich).

    Die oberen Varianten entsprechen ihrem Komplement s, so \S< / code> Ein beliebiges non -whitespace-Zeichen.

    Einmal reicht nicht

    Von dort aus Sie können Teile Ihres Musters mit Quantifizierern wiederholen. Beispielsweise entspricht der Parameter pa ttern ab?c< / code> "abc" oder "ac", da der Quantifier e the ?< / code> das von ihm modifizierte Submuster optional macht. Andere Quantifizierer sind

    • *< / code> (null oder mehrmals)
    • +< / code> (ein- oder mehrmals)
    • {n}< / code> (genau n mal)
    • {n,}< / code> (mindestens n mal)
    • {n,m}< / code> (mindestens n mal, aber nicht mehr als m mal)

    Wenn Sie einige dieser Blöcke zusammenstellen, entspricht der pa ttern [Nn]*ick< / code> allen

    • ick
    • Nick < / li>
    • nick
    • Nnick
    • nNick
    • nnick
    • (und so weiter)

    Das erste Spiel zeigt, dass eine wichtige Lektion : *< / code> immer erfolgreich ist! Jedes Muster kann null Mal übereinstimmen.

    Gruppierung

    Ein Quantifizierer ändert das Muster ganz links. Sie könnten e xpect 0abc+0< / code> mit '0abc0', '0abcabc0' usw. abgleichen, aber das Muster sofort steht links neben dem Plus-Quantifi er is c< / code>. Dieser means 0abc+0< / code> stimmt mit '0abc0', '0abcc0', '0abccc0' usw. überein.

    Zum Abgleichen einer oder mehrerer Sequenzen von 'abc' mit Nullen die Enden , use 0(abc)+0< / code>. Die Klammern bezeichnen ein Teilmuster, das als Einheit quantifiziert werden kann. Normalerweise speichern reguläre Ausdrücke oder & # 34; erfassen Sie "den Teil des Eingabetextes, der einer in Klammern stehenden Gruppe entspricht. Das Extrahieren von Bits auf diese Weise ist wesentlich flexibler und weniger fehleranfällig als das Zählen von Indice s and substr< / code>.

    Alternation

    Früher haben wir einen Weg gefunden, entweder 'Nick' oder 'Nick' zu finden. Ein anderer ist mit Alternation as in Nick|nick< / code>. Denken Sie daran, dass Alternation alles zu ihrem enthält links und alles zu seiner Rechten. Verwenden Sie zum Eingrenzen von Klammern pe of |< / code> Gruppenklammern, zB , (Nick|nick)< / code>.

    Für ein anderes Beispiel: Sie könnten gleichwertig write [a-c]< / cod e> as a|b|c< / code> sein, dies ist jedoch wahrscheinlich suboptimal, da viele Implementierungen davon ausgehen, dass Alternativen Längen von mehr als 1 haben.

    Escaping

    Auch wenn einige Zeichen sich selbst zuordnen, haben andere Bedeutungen: Der Code pa ttern \d+< / code> stimmt nicht mit dem umgekehrten Schrägstrich, gefolgt von Kleinbuchstaben D, gefolgt von einem Pluszeichen überein 'd use \\d\+< / code>. Ein Backslash entfernt die spezielle Bedeutung des folgenden Zeichens:

    Habsucht

    Quantifizierer für reguläre Ausdrücke sind gierig. Dies bedeutet, dass sie so viel Text wie möglich finden, während das gesamte Muster erfolgreich übereinstimmt.

    Nehmen Sie beispielsweise an, dass die Eingabe

    ist

    "Hallo", sagte sie, "wie geht es Ihnen?"

    Sie könnten e xpect ".+"< / code eingeben > um nur 'Hallo' zu finden und wird dann überrascht sein, wenn Sie sehen, dass es von 'Hallo' bis 'Sie?' passt.

    Wechseln Sie von gierig zu Was Sie als vorsichtig empfinden, fügen Sie dem Quantifizierer einen extra ?< / code> hinzu. Nun verstehst du d how \((.+?)\)< / code>, das Beispiel aus deiner Frage funktioniert. Es stimmt mit der Folge einer literalen linken Klammer überein, gefolgt von einem oder mehreren Zeichen und wird durch eine rechte Klammer abgeschlossen.

    Wenn Ihre Eingabe '(123) (456) ', dann ist die erste Aufnahme' 123 '. Nicht-gierige Quantifizierer möchten den Rest von t zulassenDas Muster beginnt, so bald wie möglich mit dem Abgleich zu beginnen.

    (Zu Ihrer Verwirrung kenne ich keinen Dialekt mit regulärem Ausdruck where ((.+?))< / code> würde dasselbe tun Ich habe den Verdacht, dass irgendwo auf dem Weg etwas in der Übertragung verloren gegangen ist.)

    Anker

    Verwenden Sie das spezielle Pa ttern ^< / code> nur am Anfang Ihres Inpu t and $< / code> nur am Ende übereinstimmen. "Buchstützen" mit Ihren Mustern zu erstellen, wobei Sie sagen: "Ich weiß, was vorne und hinten ist, aber geben Sie mir alles dazwischen" ist eine nützliche Technik.

    Kommentare der Form

    -- This is a comment --< / code>

    Sie würden write ^--\s+(.+)\s+--$< / code>.

    Erstellen Sie Ihre eigenen

    Reguläre Ausdrücke sind rekursiv, sodass Sie diese Grundregeln jetzt verstehen Kombinieren Sie sie wie gewünscht.

    Werkzeuge zum Schreiben und Debuggen von regulären Ausdrücken:

    Bücher

    Kostenlose Ressourcen

    18 July 2018
    13 revs, 12 users 65%Greg Bacon