JavaRush /Java-Blog /Random-DE /RegEx: 20 kurze Schritte zur Beherrschung regulärer Ausdr...
Artur
Level 40
Tallinn

RegEx: 20 kurze Schritte zur Beherrschung regulärer Ausdrücke. Teil 3

Veröffentlicht in der Gruppe Random-DE
RegEx: 20 kurze Schritte zur Beherrschung regulärer Ausdrücke. Teil 1. RegEx: 20 kurze Schritte zur Beherrschung regulärer Ausdrücke. Teil 2: In diesem Teil gehen wir zu etwas komplexeren Dingen über. Aber es wird nach wie vor nicht schwierig sein, sie zu meistern. Ich wiederhole, dass RegEx tatsächlich einfacher ist, als es auf den ersten Blick scheint, und dass man kein Raketenwissenschaftler sein muss, um es zu beherrschen und in der Praxis anzuwenden. Das englische Original dieses Artikels finden Sie hier . 20 kurze Schritte zur Beherrschung regulärer Ausdrücke.  Teil 3 - 1

Schritt 11: Klammern ()als einfangende Gruppen

20 kurze Schritte zur Beherrschung regulärer Ausdrücke.  Teil 3 - 2Im letzten Problem haben wir nach verschiedenen Arten von Ganzzahlwerten und numerischen Gleitkommawerten (Punkt) gesucht. Die Engine für reguläre Ausdrücke unterschied jedoch nicht zwischen diesen beiden Arten von Werten, da alles in einem großen regulären Ausdruck erfasst wurde. Wir können die Engine für reguläre Ausdrücke anweisen, zwischen verschiedenen Arten von Übereinstimmungen zu unterscheiden, wenn wir unsere Minimuster in Klammern setzen:
Muster: ([AZ])|([az]) 
Zeichenfolge:   Der derzeitige Präsident Boliviens ist Evo Morales .
Übereinstimmungen: ^^^ ^^^^^^^ ^^^^^^^^^ ^^ ^^^^^^^ ^^ ^^^ ^^^^^^^ 
Gruppe:    122 2222222 122222222 22 1222222 22 122 1222222  
( Beispiel ) Der obige reguläre Ausdruck definiert zwei Erfassungsgruppen, die beginnend bei 1 indiziert werden. Die erste Erfassungsgruppe entspricht jedem einzelnen Großbuchstaben und die zweite Erfassungsgruppe entspricht jedem einzelnen Kleinbuchstaben. Durch die Verwendung des „Oder“-Zeichens |und der Klammern ()als einfangende Gruppe können wir einen einzelnen regulären Ausdruck definieren, der mit mehreren Arten von Zeichenfolgen übereinstimmt. Wenn wir dies auf unsere Long/Float-Such-Regex aus dem vorherigen Teil des Artikels anwenden, erfasst die Regex-Engine die entsprechenden Übereinstimmungen in den entsprechenden Gruppen. Indem wir prüfen, mit welcher Gruppe ein Teilstring übereinstimmt, können wir sofort feststellen, ob es sich um einen Float-Wert oder einen Long-Wert handelt:
Muster: (\d*\.\d+[fF]|\d+\.\d*[fF]|\d+[fF])|(\d+[lL]) Zeichenfolge: 42L 
12   x 3,4f 6l 3,3 0F LF .2F 0.
Übereinstimmungen: ^^^ ^^^^ ^^ ^^ ^^^ 
Gruppe:    222 1111 22 11 111  
( Beispiel ) Dieser reguläre Ausdruck ist ziemlich komplex. Um ihn besser zu verstehen, wollen wir ihn aufschlüsseln und uns jedes dieser Muster ansehen:
( // entspricht jedem „float“-Teilstring
  \d*\.\d+[fF]
  |
  \d+\.\d*[fF]
  |
  \d+[fF]
)
| //ODER
( // entspricht jedem „langen“ Teilstring
  \d+[lL]
)
Mithilfe der Vorzeichen- |und Erfassungsgruppen in Klammern ()können wir verschiedene Arten von Teilzeichenfolgen zuordnen. In diesem Fall vergleichen wir entweder Gleitkommazahlen „float“ oder lange Ganzzahlen „long“.
(
  \d*\.\d+[fF] // 1+ Ziffern rechts vom Dezimalpunkt
  |
  \d+\.\d*[fF] // 1+ Ziffern links vom Dezimalpunkt
  |
  \d+[fF] // kein Punkt, nur 1+ Ziffern
)
|
(
  \d+[lL] // kein Punkt, nur 1+ Ziffern
)
In der Erfassungsgruppe „Float“ haben wir drei Optionen: Zahlen mit mindestens 1 Ziffer rechts vom Dezimalpunkt, Zahlen mit mindestens 1 Ziffer links vom Dezimalpunkt und Zahlen ohne Dezimalpunkt. Alle davon sind „Floats“, solange am Ende die Buchstaben „f“ oder „F“ angehängt sind. Innerhalb der „long“-Capture-Gruppe haben wir nur eine Option – wir müssen eine oder mehrere Ziffern gefolgt von dem Zeichen „l“ oder „L“ haben. Die Engine für reguläre Ausdrücke sucht nach diesen Teilzeichenfolgen in einer bestimmten Zeichenfolge und indiziert sie in der entsprechenden Erfassungsgruppe. beachten Siedass wir keine der Zahlen finden, zu denen kein „l“, „L“, „f“ oder „F“ hinzugefügt wurde. Wie sind diese Zahlen einzuordnen? Wenn sie einen Dezimalpunkt haben, ist die Java-Sprache standardmäßig „double“. Andernfalls müssen sie „int“ sein.

Lassen Sie uns das Gelernte mit ein paar Rätseln festigen:

Fügen Sie der obigen Regex zwei weitere Capture-Gruppen hinzu, damit auch Double- oder Int-Zahlen klassifiziert werden. (Dies ist eine weitere knifflige Frage. Lassen Sie sich nicht entmutigen, wenn es eine Weile dauert. Als letzten Ausweg sehen Sie sich meine Lösung an.)
Muster:
Saite:   42L 12 x 3.4f 6l 3.3 0F LF .2F 0. 
Übereinstimmungen: ^^^ ^^ ^^^^ ^^ ^^^ ^^ ^^^ ^^ 
Gruppe:    333 44 1111 33 222 11 111 22
( Lösung ) Das nächste Problem ist etwas einfacher. Verwenden Sie Erfassungsgruppen in Klammern (), das „Oder“-Zeichen |und Zeichenbereiche, um die folgenden Altersgruppen zu sortieren: „In den USA zum Trinken zugelassen.“ (>= 21) und „in den USA nicht trinken erlaubt“ (<21):
Muster:
Zeichenfolge:   7 10 17 18 19 20 21 22 23 24 30 40 100 120 
Übereinstimmungen: ^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ 
Gruppe:    2 22 22 22 22 22 11 11 11 11 11 11 111 111 
( Lösung )

Schritt 12: Identifizieren Sie zunächst spezifischere Übereinstimmungen

20 kurze Schritte zur Beherrschung regulärer Ausdrücke.  Teil 3 - 3Möglicherweise hatten Sie bei der letzten Aufgabe einige Probleme, wenn Sie versucht haben, „legale Trinker“ als erste Erfassungsgruppe und nicht als zweite zu definieren. Um zu verstehen, warum, schauen wir uns ein anderes Beispiel an. Angenommen, wir möchten Nachnamen mit weniger als 4 Zeichen und Nachnamen mit 4 oder mehr Zeichen getrennt aufzeichnen. Geben wir der ersten Capture-Gruppe kürzere Namen und sehen, was passiert:
Muster: ([AZ][az]?[az]?)|([AZ][az][az][az]+) 
Zeichenfolge:   Kim Job s Xu Clo yd Moh r Ngo Roc k.
Übereinstimmungen: ^^^ ^^^ ^^ ^^^ ^^^ ^^^ ^^^ 
Gruppe:    111 111 11 111 111 111 111   
( Beispiel ) Standardmäßig verwenden die meisten Engines für reguläre Ausdrücke den gierigen Vergleich mit den Grundzeichen, die wir bisher gesehen haben. Dies bedeutet, dass die Engine für reguläre Ausdrücke die längste Gruppe erfasst, die so früh wie möglich im bereitgestellten regulären Ausdruck definiert wurde. Die zweite Gruppe oben könnte zwar mehr Zeichen in Namen wie zum Beispiel „Jobs“ und „Cloyd“ erfassen, aber da die ersten drei Zeichen dieser Namen bereits von der ersten Erfassungsgruppe erfasst wurden, können sie von der zweiten nicht erneut erfasst werden . Nehmen wir nun eine kleine Korrektur vor – ändern Sie einfach die Reihenfolge der Erfassungsgruppen und platzieren Sie die spezifischere (längere) Gruppe zuerst:
Muster: ([AZ][az][az][az]+)|([AZ][az]?[az]?) 
Zeichenfolge:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
Übereinstimmungen: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
Gruppe:    222 1111 22 11111 1111 222 1111    
( Beispiel )

Aufgabe...diesmal nur eine :)

Ein „spezifischeres“ Muster bedeutet fast immer „länger“. Nehmen wir an, wir möchten zwei Arten von „Wörtern“ finden: zuerst diejenigen, die mit Vokalen beginnen (genauer gesagt), und dann diejenigen, die nicht mit Vokalen beginnen (irgendein anderes Wort). Versuchen Sie, einen regulären Ausdruck zu schreiben, um Zeichenfolgen zu erfassen und zu identifizieren, die diesen beiden Gruppen entsprechen. (Die folgenden Gruppen sind nicht nummeriert, sondern mit Buchstaben versehen. Sie müssen festlegen, welche Gruppe der ersten und welche der zweiten Gruppe entsprechen soll.)
Muster:
Zeichenfolge:   pds6f uub 24r2gp ewqrty l ui_op 
Übereinstimmungen: ^^^^^ ^^^ ^^^^^^ ^^^^^^ ^ ^^^^^ 
Gruppe:    NNNNN VVV NNNNNN VVVVVV N VVVVV
( Lösung ) Im Allgemeinen gilt: Je präziser Ihr regulärer Ausdruck, desto länger dauert er. Und je genauer es ist, desto unwahrscheinlicher ist es, dass Sie etwas erfassen, das Sie nicht benötigen. Auch wenn sie beängstigend aussehen mögen, sind längere reguläre Ausdrücke ~= bessere reguläre Ausdrücke. Bedauerlicherweise .

Schritt 13: Geschweifte Klammern {}für eine bestimmte Anzahl an Wiederholungen

20 kurze Schritte zur Beherrschung regulärer Ausdrücke.  Teil 3 - 4Im Beispiel mit Nachnamen aus dem vorherigen Schritt hatten wir zwei sich fast wiederholende Gruppen in einem Muster:
Muster: ([AZ][az][az][az]+)|([AZ][az]?[az]?) 
Zeichenfolge:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
Übereinstimmungen: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
Gruppe:    222 1111 22 11111 1111 222 1111    
Für die erste Gruppe brauchten wir Nachnamen mit vier oder mehr Buchstaben. Die zweite Gruppe musste Nachnamen mit drei oder weniger Buchstaben erfassen. Gibt es eine einfachere Möglichkeit, dies zu schreiben, als diese [a-z]Gruppen immer wieder zu wiederholen? Existiert, wenn Sie hierfür geschweifte Klammern verwenden {}. Mit geschweiften Klammern {}können wir die minimale und (optional) maximale Anzahl von Übereinstimmungen des vorherigen Zeichens oder der vorherigen Erfassungsgruppe angeben. Es gibt drei Anwendungsfälle {}:
{X} // stimmt genau X-mal überein
{X,} // entspricht >= X-mal
{X,Y} // stimmt mit >= X und <= Y überein
Hier sind Beispiele für diese drei verschiedenen Syntaxen:
Muster: [az]{11} 
Zeichenfolge:   humuhumunuk unukuapua'a.
Übereinstimmungen: ^^^^^^^^^^^   
( Beispiel )
Muster: [az]{18,} 
Zeichenfolge:   humuhumunukunukuapua 'a.
Übereinstimmungen: ^^^^^^^^^^^^^^^^^^^^^    
( Beispiel )
Muster: [az]{11,18} 
Zeichenfolge:   humuhumunukunukuap ua'a.
Übereinstimmungen: ^^^^^^^^^^^^^^^^^^    
( Beispiel ) In den obigen Beispielen sind mehrere Punkte zu beachten.Notiz:. Erstens stimmt das vorherige Zeichen oder die vorherige Gruppe bei Verwendung der {X}-Notation genau mit dieser Zahl (X) überein. Wenn das „Wort“ mehr Zeichen enthält (als die Zahl X), die mit dem Muster übereinstimmen könnten (wie im ersten Beispiel gezeigt), werden diese nicht in die Übereinstimmung einbezogen. Wenn die Anzahl der Zeichen weniger als X beträgt, schlägt die vollständige Übereinstimmung fehl (versuchen Sie im ersten Beispiel, 11 in 99 zu ändern). Zweitens sind die Notationen {X,} und {X,Y} gierig. Sie werden versuchen, so viele Zeichen wie möglich zu finden und gleichzeitig den angegebenen regulären Ausdruck zu erfüllen. Wenn Sie {3,7} angeben, können 3 bis 7 Zeichen abgeglichen werden. Wenn die nächsten 7 Zeichen gültig sind, werden alle 7 Zeichen abgeglichen. Wenn Sie {1,} angeben und alle nächsten 14.000 Zeichen übereinstimmen, werden alle 14.000 dieser Zeichen in die entsprechende Zeichenfolge aufgenommen. Wie können wir dieses Wissen nutzen, um unseren obigen Ausdruck umzuschreiben? Die einfachste Verbesserung könnte darin bestehen, die benachbarten Gruppen [a-z]durch zu ersetzen [a-z]{N}, wobei N entsprechend gewählt wird:
Muster: ([AZ][az]{2}[az]+)|([AZ][az]?[az]?)  
...aber das macht die Sache nicht viel besser. Schauen Sie sich die erste Erfassungsgruppe an: Wir haben [a-z]{2}(was genau 2 Kleinbuchstaben entspricht) gefolgt von [a-z]+(was 1 oder mehr Kleinbuchstaben entspricht). Wir können dies vereinfachen, indem wir nach 3 oder mehr Kleinbuchstaben in geschweiften Klammern fragen:
Muster: ([AZ][az]{3,})|([AZ][az]?[az]?) 
Die zweite Erfassungsgruppe ist anders. Wir brauchen in diesen Nachnamen nicht mehr als drei Zeichen, was bedeutet, dass wir eine Obergrenze haben, aber unsere Untergrenze ist Null:
Muster: ([AZ][az]{3,})|([AZ][az]{0,2}) 
Spezifität ist bei der Verwendung regulärer Ausdrücke immer besser, daher wäre es ratsam, hier aufzuhören, aber ich kann nicht anders, als zu bemerken, dass diese beiden Zeichenbereiche ( [AZ]und [az]) nebeneinander fast wie eine „Wortzeichen“-Klasse aussehen, \w( [A-Za-z0-9_]) . Wenn wir sicher wären, dass unsere Daten nur gut formatierte Nachnamen enthalten, könnten wir unseren regulären Ausdruck vereinfachen und einfach schreiben:
Muster: (\w{4,})|(\w{1,3}) 
Die erste Gruppe erfasst jede Folge von 4 oder mehr „Wortzeichen“ ( [A-Za-z0-9_]), und die zweite Gruppe erfasst jede Folge von 1 bis 3 „Wortzeichen“ (einschließlich). Ob das funktioniert?
Muster: (\w{4,})|(\w{1,3}) 
Zeichenfolge:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
Übereinstimmungen: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
Gruppe:    222 1111 22 11111 1111 222 1111    
( Beispiel ) Es hat funktioniert! Wie wäre es mit diesem Ansatz? Und es ist viel sauberer als unser vorheriges Beispiel. Da die erste Erfassungsgruppe alle Nachnamen mit vier oder mehr Zeichen abgleicht, könnten wir die zweite Erfassungsgruppe sogar einfach in ändern \w+, da wir so alle verbleibenden Nachnamen (mit 1, 2 oder 3 Zeichen) erfassen könnten:
Muster: (\w{4,})|(\w+) 
Zeichenfolge:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
Übereinstimmungen: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
Gruppe:    222 1111 22 11111 1111 222 1111    
( Beispiel )

Helfen wir dem Gehirn, dies zu lernen und die folgenden 2 Probleme zu lösen:

Verwenden Sie geschweifte Klammern {}, um den regulären Ausdruck für die Suche nach Sozialversicherungsnummern aus Schritt 7 umzuschreiben:
Muster:
Zeichenfolge: 113-25=1902 182-82-0192 H23-_3-9982 1I1-O0-E38B
Übereinstimmungen:              ^^^^^^^^^^^
( Lösung ) Gehen Sie davon aus, dass die Kennwortsicherheitsprüfung einer Website erfordert, dass Benutzerkennwörter zwischen 6 und 12 Zeichen lang sind. Schreiben Sie einen regulären Ausdruck, der die ungültigen Passwörter in der Liste unten markiert. Jedes Passwort ist ()zur einfacheren Zuordnung in Klammern enthalten. Stellen Sie daher sicher, dass der reguläre Ausdruck mit wörtlichen (und )symbolischen Zeichen beginnt und endet. Hinweis: Stellen Sie sicher, dass Sie keine literalen Klammern in Passwörtern mit [^()]o. ä. zulassen, sonst wird am Ende die gesamte Zeichenfolge gefunden!
Muster:
string:   (12345) (mein Passwort) (Xanadu.2112) (su_do) (OfSalesmen!)
Übereinstimmungen: ^^^^^^^ ^^^^^^^^^^^^^ ^^^^^^^  
( Lösung )

Schritt 14: \bRandsymbol mit Nullbreite

20 kurze Schritte zur Beherrschung regulärer Ausdrücke.  Teil 3 - 5Die letzte Aufgabe war ziemlich schwierig. Aber was wäre, wenn wir es etwas komplizierter machen würden, indem wir Passwörter in Anführungszeichen ""statt in Klammern setzen ()? Können wir eine ähnliche Lösung schreiben, indem wir einfach alle Klammerzeichen durch Anführungszeichen ersetzen?
Muster: \"[^"]{0.5}\"|\"[^"]+\s[^"]*\" 
string:   "12345" "mein Passwort" "Xanadu.2112 " " su_do" " OfSalesmen! "
Übereinstimmungen: ^^^^^^^ ^^^^^^^^^^^^^ ^^^ ^^^  
( Beispiel ) Es ist nicht sehr beeindruckend geworden. Haben Sie schon erraten, warum? Das Problem ist, dass wir hier nach falschen Passwörtern suchen. „Xanadu.2112“ ist ein gutes Passwort. Wenn die Regex also erkennt, dass diese Sequenz keine Leerzeichen oder Literalzeichen enthält ", wird sie direkt vor dem Zeichen zurückgegeben ", das das Passwort auf der rechten Seite qualifiziert. (Weil wir mit angegeben haben, dass Zeichen "nicht in Passwörtern gefunden werden können [^"].) Sobald die Engine für reguläre Ausdrücke überzeugt ist, dass diese Zeichen nicht mit einem bestimmten regulären Ausdruck übereinstimmen, wird sie erneut ausgeführt, und zwar genau an der Stelle, an der sie aufgehört hat – an der Stelle, an der sich das Zeichen befand ". Dies begrenzt „ Xanadu.2112“ rechts. Von dort aus sieht er ein Leerzeichen und ein anderes Zeichen "– für ihn ist das das falsche Passwort! Im Grunde findet er diese Sequenz " "und geht weiter. Das ist überhaupt nicht das, was wir gerne hätten ... Es wäre toll, wenn wir festlegen könnten, dass das erste Zeichen des Passworts kein Leerzeichen sein soll. Gibt es eine Möglichkeit, dies zu tun? (Inzwischen haben Sie wahrscheinlich erkannt, dass die Antwort auf alle meine rhetorischen Fragen „Ja“ lautet.) Ja! Es gibt so einen Weg! Viele Engines für reguläre Ausdrücke stellen eine Escape-Sequenz wie „Wortgrenze“ bereit \b. „Wortgrenze“ \bist eine Escape-Sequenz mit der Breite Null, die seltsamerweise einer Wortgrenze entspricht. Denken Sie daran, dass wir mit „Wort“ entweder eine beliebige Zeichenfolge in der Klasse \woder gemeint haben [A-Za-z0-9_]. Eine Wortgrenzenübereinstimmung bedeutet, dass das Zeichen unmittelbar vor oder unmittelbar nach der Sequenz ein Wortzeichen \bsein muss . неBeim Abgleich schließen wir dieses Zeichen jedoch nicht in unsere erfasste Teilzeichenfolge ein. Dies ist die Breite Null. Um zu sehen, wie das funktioniert, schauen wir uns ein kleines Beispiel an:
Muster: \b[^ ]+\b 
string:   Wir wollen immer noch Geld , Lebowski .
Übereinstimmungen: ^^ ^^^^^ ^^^^ ^^ ^^^^^ ^^^^^^^^  
( Beispiel ) Die Sequenz [^ ]muss mit jedem Zeichen übereinstimmen, das kein Literal-Leerzeichen ist. Warum stimmt dies also nicht mit dem Komma ,nach Geld oder dem Punkt „ .nach Lebowski überein? Das liegt daran, dass Komma ,und Punkt .keine Wortzeichen sind, sodass Grenzen zwischen Wortzeichen und Nicht-Wortzeichen geschaffen werden. Sie erscheinen zwischen ydem Ende des Wort „Geld“ und dem Komma ,, das darauf folgt. und zwischen „ idem Wort Lebowski und dem Punkt .(Punkt/Punkt), der darauf folgt. Der reguläre Ausdruck stimmt mit den Grenzen dieser Wörter überein (jedoch nicht mit den Nichtwortzeichen, die nur zur Definition dieser Wörter beitragen). Aber was passiert, wenn wir keine Konsistenz \bin unsere Vorlage einbauen?
Muster: [^ ]+ 
Zeichenfolge:   Wir wollen immer noch Geld, Lebowski. 
Übereinstimmungen: ^^ ^^^^^ ^^^^ ^^ ^^^^^^ ^^^^^^^^^  
( Beispiel ) Ja, jetzt finden wir auch diese Satzzeichen. Lassen Sie uns nun Wortgrenzen verwenden, um den regulären Ausdruck für Passwörter in Anführungszeichen zu korrigieren:
Muster: \"\b[^"]{0.5}\b\"|\"\b[^"]+\s[^"]*\b\" 
string:   "12345" "mein Passwort" " Xanadu. 2112" "su_do" "OfSalesmen!"
Übereinstimmungen: ^^^^^^^ ^^^^^^^^^^^^^ ^^^^^^^  
( Beispiel ) Indem wir Wortgrenzen in Anführungszeichen setzen („\b ... \b“), sagen wir effektiv, dass das erste und das letzte Zeichen übereinstimmender Passwörter „Wortzeichen“ sein müssen. Das funktioniert hier also gut, funktioniert aber nicht so gut, wenn das erste oder letzte Zeichen des Benutzerpassworts kein Wortzeichen ist:
Muster: \"\b[^"]{0.5}\b\"|\"\b[^"]+\s[^"]*\b\"
string: „thefollowingpasswordistooshort“ „C++“
Streichhölzer:   
( Beispiel ) Sehen Sie, wie das zweite Passwort nicht als „ungültig“ markiert wird, obwohl es eindeutig zu kurz ist. du musst seinvorsichtigmit Sequenzen \b, da sie nur mit den Grenzen zwischen den Zeichen übereinstimmen \wund nicht \w. Da wir im obigen Beispiel keine Zeichen in Passwörtern zugelassen haben \w, ist die Grenze zwischen \und dem ersten/letzten Zeichen des Passworts nicht garantiert eine Wortgrenze \b.

Um diesen Schritt abzuschließen, lösen wir nur ein einfaches Problem:

Wortgrenzen sind in Syntaxhervorhebungs-Engines nützlich, wenn wir eine bestimmte Zeichenfolge abgleichen möchten, aber sicherstellen möchten, dass sie nur am Anfang oder Ende eines Wortes (oder einzeln) vorkommen. Nehmen wir an, wir schreiben eine Syntaxhervorhebung und möchten das Wort var hervorheben, aber nur, wenn es alleine erscheint (ohne andere Zeichen im Wort zu berühren). Können Sie dafür einen regulären Ausdruck schreiben? Natürlich kannst du das, es ist eine sehr einfache Aufgabe ;)
Muster:
Zeichenfolge:   var varx _var ( var j) barvarcar * var var -> { var }
Übereinstimmungen: ^^^ ^^^ ^^^ ^^^ ^^^  
( Lösung )

Schritt 15: „Caret“ ^als „Zeilenanfang“ und Dollarzeichen $als „Zeilenende“

20 kurze Schritte zur Beherrschung regulärer Ausdrücke.  Teil 3 - 6Die Wortgrenzensequenz \b(aus dem letzten Schritt des vorherigen Teils des Artikels) ist nicht die einzige spezielle Sequenz mit der Breite Null, die für die Verwendung in regulären Ausdrücken verfügbar ist. Die beiden beliebtesten sind „Caret“ ^– „Zeilenanfang“ und Dollarzeichen $– „Zeilenende“. Wenn Sie einen dieser Punkte in Ihre regulären Ausdrücke einbinden, bedeutet dies, dass die Übereinstimmung am Anfang oder Ende der Quellzeichenfolge stehen muss:
Muster: ^start|end$ 
Zeichenfolge:   Start Ende Start Ende Start Ende Start Ende 
Übereinstimmungen: ^^^^^ ^^^  
( Beispiel ) Wenn Ihre Zeichenfolge Zeilenumbrüche enthält, ^startentspricht sie der Sequenz „start“ am Anfang jeder Zeile und end$der Sequenz „end“ am Ende jeder Zeile (obwohl dies hier schwer darzustellen ist). Diese Symbole sind besonders nützlich, wenn Sie mit Daten arbeiten, die Trennzeichen enthalten. Kehren wir mit „ ^Zeilenanfang“ zum Thema „Dateigröße“ aus Schritt 9 zurück. In diesem Beispiel werden unsere Dateigrößen durch Leerzeichen „ “ getrennt. Daher möchten wir, dass jede Dateigröße mit einer Zahl beginnt, der ein Leerzeichen oder der Anfang einer Zeile vorangestellt ist:
Muster: (^| )(\d+|\d+\.\d+)[KMGT]B 
Zeichenfolge:   6,6 KB 1..3 KB 12 KB 5G 3,3 MB KB .6,2 TB 9 MB .
Übereinstimmungen: ^^^^^ ^^^^^ ^^^^^^ ^^^^ 
Gruppe:    222 122 1222 12    
( Beispiel ) Wir sind dem Ziel schon so nah! Möglicherweise stellen Sie jedoch fest, dass wir immer noch ein kleines Problem haben: Wir passen das Leerzeichen vor der gültigen Dateigröße an. Jetzt können wir diese einfangende Gruppe (1) einfach ignorieren, wenn unsere Engine für reguläre Ausdrücke sie findet, oder wir können eine nicht einfangende Gruppe verwenden, die wir im nächsten Schritt sehen werden.

Lassen Sie uns in der Zwischenzeit zwei weitere Probleme für den Ton lösen:

Wenn wir mit unserem Syntaxhervorhebungsbeispiel aus dem letzten Schritt fortfahren, markieren einige Syntaxhervorhebungen nachgestellte Leerzeichen, d. h. alle Leerzeichen, die zwischen einem Nicht-Leerzeichen und dem Ende der Zeile stehen. Können Sie einen regulären Ausdruck schreiben, um nur nachfolgende Leerzeichen hervorzuheben?
Muster:
Zeichenfolge: myvec <- c(1, 2, 3, 4, 5)  
Übereinstimmungen:                          ^^^^^^^  
( Lösung ) Ein einfacher CSV-Parser (Comma-Separated Value) sucht nach durch Kommas getrennten „Tokens“. Im Allgemeinen hat ein Leerzeichen keine Bedeutung, es sei denn, es wird in Anführungszeichen gesetzt "". Schreiben Sie einen einfachen regulären CSV-Parsing-Ausdruck, der Tokens zwischen Kommas abgleicht, aber Leerzeichen, die nicht zwischen Anführungszeichen stehen, ignoriert (nicht erfasst).
Muster:
Zeichenfolge:   a, „b“, „c d“,e,f, „g h“, dfgi,, k, „“, l 
Übereinstimmungen: ^^ ^^^^ ^^^^^^^^^^ ^^^ ^^^ ^^^^^^ ^^ ^^^ ^ 
Gruppe:    21 2221 2222212121 222221 222211 21 221 2    
( Lösung ) RegEx: 20 kurze Schritte zur Beherrschung regulärer Ausdrücke. Teil 4.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION