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 2

Veröffentlicht in der Gruppe Random-DE
RegEx: 20 kurze Schritte zur Beherrschung regulärer Ausdrücke. Teil 1 Original hier Im letzten Teil haben wir die einfachsten regulären Ausdrücke gemeistert und schon einiges gelernt. In diesem Teil werden wir etwas komplexere Designs untersuchen, aber glauben Sie mir, es wird nicht so schwierig sein, wie es scheint. RegEx: 20 kurze Schritte zur Beherrschung regulärer Ausdrücke.  Teil 2 - 1Also lasst uns weitermachen!

Schritt 8: Stern- *und Pluszeichen+

RegEx: 20 kurze Schritte zur Beherrschung regulärer Ausdrücke.  Teil 2 - 2Bisher konnten wir mehr oder weniger nur Zeichenfolgen einer bestimmten Länge abgleichen. Aber bei den neuesten Problemen haben wir uns der Grenze dessen genähert, was wir mit der Notation, die wir bisher gesehen haben, machen können. Nehmen wir zum Beispiel an, dass wir nicht auf 3-stellige Java-Bezeichner beschränkt sind, sondern dass wir Bezeichner beliebiger Länge haben können. Eine Lösung, die im vorherigen Beispiel möglicherweise funktioniert hat, funktioniert im folgenden Beispiel nicht:
Muster: [a-zA-Z_$]\w\w 
Zeichenfolge:   __e $12 3 3.2 fo Bar r a23 mm ab x
Übereinstimmungen: ^^^ ^^^ ^^^ ^^^  
( Beispiel ) beachten Siedass, wenn eine Kennung gültig, aber länger als 3 Zeichen ist, nur die ersten drei Zeichen übereinstimmen. Und wenn der Bezeichner gültig ist, aber weniger als 3 Zeichen enthält, wird er von Regex überhaupt nicht gefunden! Das Problem besteht darin, dass Ausdrücke in Klammern []genau einem Zeichen entsprechen, ebenso wie Zeichenklassen wie \w. Das bedeutet, dass alle Übereinstimmungen im obigen regulären Ausdruck genau drei Zeichen lang sein müssen. Es funktioniert also nicht so gut, wie wir es uns erhofft hatten. *Die Sonderzeichen und können hier helfen +. Hierbei handelt es sich um Modifikatoren, die rechts von jedem Ausdruck hinzugefügt werden können, um diesen Ausdruck mehr als einmal zu treffen. Der Kleene-Stern (oder „Sternchen“) *zeigt an, dass der vorherige Token beliebig oft, einschließlich null Mal, abgeglichen werden muss. Das Pluszeichen +zeigt an, dass Sie eine oder mehrere Suchanfragen durchführen müssen. Daher ist der vorangehende Ausdruck +obligatorisch (mindestens einmal), während der vorangehende Ausdruck *optional ist, aber wenn er erscheint, kann er beliebig oft vorkommen. Mit diesem Wissen können wir nun den obigen regulären Ausdruck korrigieren:
Muster: [a-zA-Z_$]\w* 
Zeichenfolge:   __e $123 3.2 fo Barr a23mm ab x 
Übereinstimmungen: ^^^ ^^^^ ^^ ^^^^ ^^^^^ ^^ ^ 
( Beispiel ) Jetzt gleichen wir gültige Bezeichner beliebiger Länge ab! Bingo! Aber was würde passieren, wenn wir ? +anstelle von ? verwenden würden *?
Muster: [a-zA-Z_$]\w+ 
Zeichenfolge:   __e $123 3,2 für Barr a23mm ab x
Übereinstimmungen: ^^^ ^^^^ ^^ ^^^^ ^^^^^ ^^ 
( Beispiel ) Wir haben das letzte Spiel verpasst, х. Dies liegt daran, dass +mindestens ein Zeichen übereinstimmen muss, aber da der []vorangehende Klammerausdruck \w+das Zeichen bereits „aufgefressen“ hat x, sind keine weiteren Zeichen verfügbar, sodass die Übereinstimmung fehlschlägt. Wann können wir verwenden +? Wenn wir mindestens eine Übereinstimmung finden müssen, es aber keine Rolle spielt, wie oft ein bestimmter Ausdruck übereinstimmen muss. Wenn wir beispielsweise Zahlen finden möchten, die einen Dezimalpunkt enthalten:
Muster: \d*\.\d+ 
Zeichenfolge:   0,011 ,2 42 2,0 3,33 4,000 5 6 7,89012 
Übereinstimmungen: ^^^^^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^^  
( Beispiel ) beachten Siedass wir sowohl 0,011 als auch 0,2 finden konnten, indem wir die Zahlen links vom Dezimalpunkt optional machten. Dazu mussten wir genau einen Dezimalpunkt mit \.und mindestens eine Ziffer rechts vom Dezimalpunkt mit abgleichen \d+. Der obige reguläre Ausdruck stimmt nicht mit einer Zahl wie überein 3., da für die Übereinstimmung mindestens eine Ziffer rechts vom Dezimalpunkt erforderlich ist.

Lassen Sie uns wie üblich ein paar einfache Probleme lösen:

Finden Sie alle englischen Wörter in der folgenden Passage.
Muster:
Zeichenfolge: 3 plus 3 ist sechs, aber 4 plus drei ist 7
Übereinstimmungen:    ^^^^ ^^ ^^^ ^^^ ^^^^ ^^^^^ ^^ 
( Lösung ) Finden Sie alle Dateigrößensymbole in der Liste unten. Dateigrößen bestehen aus einer Zahl (mit oder ohne Dezimalpunkt), gefolgt von KB, oder : MBGBTB
Muster:
Zeichenfolge:   11 TB 13 14,4 MB 22 HB 9,9 GB TB 0 KB 
Übereinstimmungen: ^^^^ ^^^^^^ ^^^^^ ^^^  
( Lösung )

Schritt 9: „optionales“ Fragezeichen?

RegEx: 20 kurze Schritte zur Beherrschung regulärer Ausdrücke.  Teil 2 - 3Haben Sie bereits Regex geschrieben, um das letzte Problem zu lösen? Hat es funktioniert? Versuchen Sie es jetzt hier:
Muster:
Zeichenfolge: 1..3KB 5...GB ..6TB
Streichhölzer:  
Offensichtlich ist keine dieser Bezeichnungen eine gültige Dateigröße, daher sollte ein guter regulärer Ausdruck mit keiner von beiden übereinstimmen. Die Lösung, die ich zur Lösung des letzten Problems geschrieben habe, stimmt mit allen überein, zumindest teilweise:
Muster: \d+\.*\d*[KMGT]B 
Zeichenfolge:   1..3KB  5...GB .. 6TB 
Übereinstimmungen: ^^^^^^ ^^^^^^ ^^^ 
( Beispiel ) Was ist also das Problem? Tatsächlich müssen wir nur einen Dezimalpunkt finden, falls es einen gibt. Aber *es erlaubt eine beliebige Anzahl von Übereinstimmungen, einschließlich null. Gibt es eine Möglichkeit, nur null oder nur ein einziges Mal zuzuordnen? Aber nicht mehr als einmal? Natürlich gibt es. „optional“ ?ist ein Modifikator, der mit null oder einem der vorhergehenden Zeichen übereinstimmt, aber nicht mit mehr:
Muster: \d+\.?\d*[KMGT]B 
Zeichenfolge: 1.. 3KB 5...GB .. 6TB 
Übereinstimmungen:     ^^^ ^^^ 
( Beispiel ) Hier sind wir einer Lösung näher, aber das ist nicht ganz das, was wir brauchen. Wir werden später in wenigen Schritten sehen, wie wir das Problem beheben können.

Lassen Sie uns in der Zwischenzeit dieses Problem lösen:

In einigen Programmiersprachen (z. B. Java) können auf einige Ganzzahl- und Gleitkommazahlen (Punkt) ein l/ Lund f/ folgen F, um anzugeben, dass sie als long/float (bzw.) und nicht als reguläre int/double behandelt werden sollten. Finden Sie alle gültigen „langen“ Zahlen in der folgenden Zeile:
Muster:
Zeichenfolge:   13L lang 2l 19 L lL 0 
Übereinstimmungen: ^^^ ^^ ^^ ^ 
( Lösung )

Schritt 10: „oder“-Zeichen|

RegEx: 20 kurze Schritte zur Beherrschung regulärer Ausdrücke.  Teil 2 - 4In Schritt 8 hatten wir einige Schwierigkeiten, die verschiedenen Arten von Gleitkommazahlen zu finden:
Muster: \d*\.\d+ 
Zeichenfolge:   0,011 ,2 42 2,0 3,33 4,000 5 6 7,89012 
Übereinstimmungen: ^^^^^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^^  
Das obige Muster gleicht Zahlen mit einem Dezimalpunkt und mindestens einer Ziffer rechts vom Dezimalpunkt ab. Was aber, wenn wir auch Zeichenfolgen wie „abgleichen“ möchten 0.? (Keine Zahlen rechts vom Dezimalpunkt.) Wir könnten einen regulären Ausdruck wie diesen schreiben:
Muster: \d*\.\d* 
Zeichenfolge:   0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 0. . 
Übereinstimmungen: ^^^^^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^^ ^^ ^ 
( Beispiel ) Dies stimmt überein 0., aber es stimmt auch mit einem einzelnen Punkt überein ., wie Sie oben sehen können. Eigentlich versuchen wir zwei verschiedene String-Klassen abzugleichen:
  1. Zahlen mit mindestens einer Ziffer rechts vom Dezimalpunkt
  2. Zahlen mit mindestens einer Ziffer links vom Dezimalpunkt
Schreiben wir die folgenden zwei regulären Ausdrücke unabhängig voneinander:
Muster: \d*\.\d+ 
string:   0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 0. .
Übereinstimmungen: ^^^^^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^^  
Muster: \d+\.\d* 
Zeichenfolge:   0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 0. .
Übereinstimmungen: ^^^^^ ^^^ ^^^^ ^^^^^ ^^^^^^^ ^^ 
Wir sehen , dass in keinem dieser Fälle die Teilzeichenfolgen 42, oder von der Engine gefunden werden. Um das gewünschte Ergebnis zu erhalten, würde es uns nicht schaden, diese regulären Ausdrücke zu kombinieren. Wie können wir das erreichen? Das „oder“-Zeichen ermöglicht es uns, in einem regulären Ausdruck mehrere mögliche Übereinstimmungsfolgen gleichzeitig anzugeben. So wie wir mit dem „oder“-Zeichen alternative Einzelzeichen angeben können, können wir auch alternative Ausdrücke mit mehreren Zeichen angeben. Wenn wir beispielsweise „Hund“ oder „Katze“ finden möchten, könnten wir etwa Folgendes schreiben: 56.|[]|
Muster: \w\w\w 
Zeichenfolge:   Offensichtlich ist ein Hund ein besseres Haustier als eine Katze .
Übereinstimmungen: ^^^^^^^^^ ^^^ ^^^^^^ ^^^ ^^^ ^^^ 
( Beispiel ) ... aber dies entspricht allen dreifachen Zeichenfolgen der Klasse „Wort“. Aber „Hund“ und „Katze“ haben nicht einmal gemeinsame Buchstaben, daher helfen uns eckige Klammern hier nicht weiter. Hier ist der einfachste reguläre Ausdruck, den wir verwenden könnten, der mit beiden und nur diesen beiden Wörtern übereinstimmt:
Muster: Hund|Katze 
Zeichenfolge: Offensichtlich ist ein Hund ein besseres Haustier als eine Katze .
Übereinstimmungen:               ^^^ ^^^ 
( Beispiel ) Die Engine für reguläre Ausdrücke versucht zunächst, die gesamte Sequenz links vom Zeichen abzugleichen |. Wenn dies jedoch fehlschlägt, versucht sie dann, die Sequenz rechts vom Zeichen abzugleichen |. Es können auch mehrere Zeichen |verkettet werden, um mehr als zwei alternativen Sequenzen zu entsprechen:
Muster: dog|cat|pet 
string: Offensichtlich ist ein Hund ein besseres Haustier als eine Katze .
Übereinstimmungen:               ^^^ ^^^ ^^^ 
( Beispiel )

Lassen Sie uns nun noch ein paar Probleme lösen, um diesen Schritt besser zu verstehen:

Verwenden Sie das Vorzeichen |, um den obigen dezimalen regulären Ausdruck zu korrigieren, um ein Ergebnis wie dieses zu erhalten:
Muster:
Zeichenfolge:   0,011 ,2 42 2,0 3,33 4,000 5 6 7,89012 0. .
Übereinstimmungen: ^^^^^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^^ ^^ 
( Lösung ) Verwenden Sie sign |, Zeichenklassen, „optional“ ?usw., um einen einzelnen regulären Ausdruck zu erstellen, der sowohl mit Ganzzahlen als auch mit Gleitkommazahlen (Punkt) übereinstimmt, wie im Problem am Ende des vorherigen Schritts besprochen (dieses Problem ein wenig). komplizierter, ja ;))
Muster:
Saite:   42L 12 x 3.4f 6l 3.3 0F LF .2F 0. 
Übereinstimmungen: ^^^ ^^ ^^^^ ^^ ^^^ ^^ ^^^ ^^  
( Lösung ) 20 kurze Schritte zur Beherrschung regulärer Ausdrücke. Teil 3 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