Ruby Reguläre Ausdrücke

Reguläre Ausdrückesind eine spezielle Zeichenfolge, die mithilfe eines Musters mit spezialisierter Syntax eine Sammlung von Zeichenketten abgleicht oder durchsucht.

Reguläre Ausdrücke verwenden eine vordefinierte Menge spezifischer Zeichen und Kombinationen dieser Zeichen, um eine "Regelzeichenfolge" zu bilden, die verwendet wird, um eine Filterlogik für Zeichenketten auszudrücken.

Syntax

Reguläre AusdrückeWörtlich ist es ein Muster zwischen Schrägstrichen oder zwischen beliebigen Trennzeichen nach %r, wie unten gezeigt:

/pattern/ /pattern/im #Optionen können angegeben werden %r!/usr/local! #Reguläre Ausdrücke mit Trennzeichen

Beispiele

#!/usr/bin/ruby line1 = "Katzen sind schlauer als Hunde"; line2 = "Hunde mögen auch Fleisch"; if ( line1 =~ /Cats(.*)/ ) puts "Line1 enthält Cats" end if ( line2 =~ /Cats(.*)/ ) puts "Line2 contains Dogs" end

Ausprobieren »

Die Ausgabe des obigen Beispiels ist:

Line1 contains Cats

Modifikatoren für reguläre Ausdrücke

Ein regulärer Ausdruck kann einen optionalen Modifikator enthalten, um verschiedene Aspekte des Abgleichs zu steuern. Der Modifikator wird nach dem zweiten Slash-Zeichen angegeben, wie im obigen Beispiel gezeigt. Die folgende Tabelle listet die möglichen Modifikatoren auf:

ModifiziererBeschreibung
iIgnoriert Groß- und Kleinschreibung beim Abgleich von Text.
oFührt #{} Interpolation nur einmal aus; der reguläre Ausdruck wird beim ersten Mal ausgewertet.
xIgnoriert Leerzeichen, sodass Leerraum und Kommentare innerhalb des gesamten Ausdrucks platziert werden können.
mMehrere Zeilen abgleichen, wobei Zeilenumbruchzeichen als normale Zeichen behandelt werden.
u,e,s,nInterpretiert den regulären Ausdruck als Unicode (UTF-8), EUC, SJIS oder ASCII. Wenn kein Modifikator angegeben ist, wird davon ausgegangen, dass der reguläre Ausdruck die Quellkodierung verwendet.

So wie Zeichenketten durch %Q begrenzt werden, erlaubt Ruby die Verwendung von %r als Anfang eines regulären Ausdrucks, gefolgt von einem beliebigen Begrenzer. Dies ist sehr nützlich, wenn Muster beschrieben werden, die viele Schrägstriche enthalten, die Sie nicht escapen möchten.

#Das Folgende gleicht einen einzelnen Schrägstrich ab, ohne zu escapen: %r|/| # Flag-Zeichen können mit der folgenden Syntax abgeglichen werden %r[</(.*)>]i

Muster für reguläre Ausdrücke

Mit Ausnahme von Steuerzeichen,(+ ? . * ^ $ ( ) [ ] { } | \)stimmen alle anderen Zeichen mit sich selbst überein. Sie können Steuerzeichen escapen, indem Sie einen Backslash davor setzen.

Die folgende Tabelle listet die in Ruby verfügbare Syntax für reguläre Ausdrücke auf.

MusterBeschreibung
^Entspricht dem Anfang einer Zeile.
$Entspricht dem Ende einer Zeile.
.Entspricht einem beliebigen einzelnen Zeichen außer Zeilenumbruch. Mit der Option m entspricht es auch einem Zeilenumbruch.
[...]Entspricht einem beliebigen einzelnen Zeichen in eckigen Klammern.
[^...]Entspricht einem beliebigen einzelnen Zeichen, das nicht in eckigen Klammern enthalten ist.
re*Entspricht dem vorausgehenden Teilausdruck null- oder mehrmals.
re+Entspricht dem vorausgehenden Teilausdruck ein- oder mehrmals.
re?Entspricht dem vorausgehenden Teilausdruck null oder einmal.
re{ n}Entspricht dem vorausgehenden Teilausdruck genau n-mal.
re{ n,}Entspricht dem vorausgehenden Teilausdruck n-mal oder öfter.
re{ n, m}Entspricht dem vorausgehenden Teilausdruck mindestens n-mal und höchstens m-mal.
a| bEntspricht a oder b.
(re)Gruppiert einen regulären Ausdruck und merkt sich den übereinstimmenden Text.
(?imx)Schaltet die Option i, m oder x innerhalb des regulären Ausdrucks vorübergehend ein. Wenn sie sich innerhalb von Klammern befindet, wirkt sie nur auf den Teil innerhalb der Klammern.
(?-imx)Schaltet die Option i, m oder x innerhalb des regulären Ausdrucks vorübergehend aus. Wenn sie sich innerhalb von Klammern befindet, wirkt sie nur auf den Teil innerhalb der Klammern.
(?: re)Gruppiert einen regulären Ausdruck, merkt sich aber nicht den übereinstimmenden Text.
(?imx: re)Schaltet die Optionen i, m oder x innerhalb von Klammern vorübergehend ein.
(?-imx: re)Schaltet die Optionen i, m oder x innerhalb von Klammern vorübergehend aus.
(?#...)Kommentar.
(?= re)Legt eine Position mithilfe eines Musters fest. Hat keinen Bereich.
(?! re)Legt eine Position mithilfe eines negierten Musters fest. Hat keinen Bereich.
(?> re)Entspricht einem unabhängigen Muster ohne Backtracking.
\wEntspricht einem Wortzeichen.
\WEntspricht einem Nicht-Wortzeichen.
\sEntspricht einem Leerraumzeichen. Äquivalent zu [\t\n\r\f].
\SStimmt mit einem Nicht-Leerzeichen-Zeichen überein.
\dStimmt mit einer Ziffer überein. Äquivalent zu [0-9].
\DStimmt mit einem Nicht-Ziffer-Zeichen überein.
\AStimmt mit dem Anfang einer Zeichenkette überein.
\ZStimmt mit dem Ende der Zeichenkette überein. Wenn ein Zeilenumbruch vorhanden ist, stimmt es nur vor dem Zeilenumbruch überein.
\zEntspricht dem Ende der Zeichenkette.
\GStimmt mit der Stelle überein, an der der letzte Treffer abgeschlossen wurde.
\bStimmt mit einer Wortgrenze außerhalb von Klammern überein; stimmt mit einem Backspace (0x08) innerhalb von Klammern überein.
\BStimmt mit einer Nicht-Wortgrenze überein.
\n, \t, usw.Stimmt mit Zeilenumbruch, Wagenrücklauf, Tabulator usw. überein.
\1...\9Stimmt mit dem n-ten gruppierten Teilausdruck überein.
\10Wenn es bereits übereingestimmt hat, stimmt es mit dem n-ten gruppierten Teilausdruck überein. Andernfalls bezieht es sich auf die oktale Darstellung einer Zeichenkodierung.

Beispiele für reguläre Ausdrücke

Zeichen

BeispieleBeschreibung
/ruby/Stimmt mit "ruby" überein
¥Entspricht dem Yen-Zeichen. Ruby 1.9 und Ruby 1.8 unterstützen mehrere Zeichen.

Zeichenklassen

BeispieleBeschreibung
/[Rr]uby/ Entspricht "Ruby" oder "ruby"
/rub[ye]/ Entspricht "ruby" oder "rube"
/[aeiou]/Entspricht einem beliebigen kleingeschriebenen Vokal
/[0-9]/ Entspricht einer beliebigen Ziffer, wie /
/[a-z]/Entspricht einem beliebigen kleingeschriebenen ASCII-Buchstaben
/[A-Z]/Entspricht einem beliebigen großgeschriebenen ASCII-Buchstaben
/[a-zA-Z0-9]/Entspricht einem beliebigen Zeichen in den eckigen Klammern
/[^aeiou]/ Entspricht jedem Zeichen, das kein kleingeschriebener Vokal ist
/[^0-9]/Entspricht jedem Zeichen, das keine Ziffer ist

Spezielle Zeichenklassen

BeispieleBeschreibung
/./ Entspricht jedem Zeichen außer Zeilenumbruch
/./m Entspricht im Mehrzeilenmodus auch einem Zeilenumbruch
/\d/Entspricht einer Ziffer, äquivalent zu /[0-9]/
/\D/ Entspricht einer Nicht-Ziffer, äquivalent zu /[^0-9]/
/\s/Entspricht einem Whitespace-Zeichen, äquivalent zu /[ \t\r\n\f]/
/\S/ Entspricht einem Nicht-Whitespace-Zeichen, äquivalent zu /[^ \t\r\n\f]/
/\w/ Entspricht einem Wortzeichen, äquivalent zu /[A-Za-z0-9_]/
/\W/Entspricht einem Nicht-Wortzeichen, äquivalent zu /[^A-Za-z0-9_]/

Wiederholung

BeispieleBeschreibung
/ruby?/ Entspricht "rub" oder "ruby". Das y ist optional.
/ruby*/ Entspricht "rub" plus null oder mehr y's.
/ruby+/Entspricht "rub" plus ein oder mehr y's.
/\d{3}/Entspricht genau 3 Ziffern.
/\d{3,}/Entspricht 3 oder mehr Ziffern.
/\d{3,5}/Entspricht 3, 4 oder 5 Ziffern.

Nicht-gierige Wiederholung

Dies entspricht der kleinsten Anzahl an Wiederholungen.

BeispieleBeschreibung
/<.*>/Gierige Wiederholung: entspricht "<ruby>perl>"
/<.*?>/ Nicht-gierige Wiederholung: entspricht "<ruby>" in "<ruby>perl>"

Gruppierung mit runden Klammern

BeispieleBeschreibung
/\D\d+/ Ohne Gruppierung: + wiederholt \d
/(\D\d)+/ Mit Gruppierung: + wiederholt das Paar \D\d
/([Rr]uby(, )?)+/Trifft auf "Ruby", "Ruby, ruby, ruby" usw. zu

Rückverweise

Dies trifft erneut auf eine zuvor gefundene Gruppe zu.

BeispieleBeschreibung
/([Rr])uby&\1ails/Trifft auf ruby&rails oder Ruby&Rails zu
/(['"])(?:(?!\1).)*\1/Zeichenketten in einfachen oder doppelten Anführungszeichen. \1 stimmt mit den Zeichen überein, die von der ersten Gruppe gefunden wurden, \2 stimmt mit denen überein, die von der zweiten Gruppe gefunden wurden, und so weiter.

Alternation

BeispieleBeschreibung
/ruby|rube/Entspricht "ruby" oder "rube"
/rub(y|le)/Trifft auf "ruby" oder "ruble" zu
/ruby(!+|\?)/ "ruby" gefolgt von einem oder mehreren ! oder einem ?

Anker

Dies erfordert die Angabe einer Übereinstimmungsposition.

BeispieleBeschreibung
/^Ruby/Entspricht einer Zeichenkette oder Zeile, die mit "Ruby" beginnt
/Ruby$/ Entspricht einer Zeichenkette oder Zeile, die mit "Ruby" endet
/\ARuby/ Entspricht einer Zeichenkette, die mit "Ruby" beginnt
/Ruby\Z/Entspricht einer Zeichenkette, die mit "Ruby" endet
/\bRuby\b/Entspricht "Ruby" an einer Wortgrenze
/\brub\B/\B ist eine Nicht-Wortgrenze: stimmt mit "rub" in "rube" und "ruby" überein, aber nicht mit einem eigenständigen "rub"
/Ruby(?=!)/Trifft auf "Ruby" zu, wenn ein Ausrufezeichen folgt
/Ruby(?!!)/ Trifft auf "Ruby" zu, wenn kein Ausrufezeichen folgt

Spezielle Syntax für Klammern

BeispieleBeschreibung
/R(?#comment)/ Trifft auf "R" zu. Alle übrigen Zeichen sind Kommentare.
/R(?i)uby/ Groß-/Kleinschreibung wird beim Abgleich mit "uby" nicht unterschieden.
/R(?i:uby)/ Wie oben.
/rub(?:y|le))/Nur Gruppe, kein \1-Rückverweis

Suchen und Ersetzen

subundgsubund ihre Substitutionsvariablensub!undgsub!sind wichtige String-Methoden bei der Verwendung regulärer Ausdrücke.

Alle diese Methoden führen Such- und Ersetzungsoperationen unter Verwendung von Mustern regulärer Ausdrücke durch.subundsub!Ersetzt das erste Vorkommen des Musters,gsubundgsub!Ersetzt alle Vorkommen des Musters.

subundgsubGibt eine neue Zeichenkette zurück, wobei die ursprüngliche Zeichenkette unverändert bleibt, währendsub!undgsub!verändert die Zeichenkette, auf der sie aufgerufen werden.

Beispiele

#!/usr/bin/ruby # -*- coding: UTF-8 -*- phone = "138-3453-1111 #Dies ist eine Telefonnummer" #Ruby-Kommentare entfernen phone = phone.sub!(/#.*$/, "") puts "Telefonnummer: #{phone}" #Andere Zeichen als Ziffern entfernen phone = phone.gsub!(/\D/, "") puts "Telefonnummer : #{phone}"

Ausprobieren »

Die Ausgabe des obigen Beispiels ist:

电话号码 : 138-3453-1111 
电话号码 : 13834531111

Beispiele

#!/usr/bin/ruby # -*- coding: UTF-8 -*- Text = "rails ist rails, Ruby on Rails ist ein sehr gutes Ruby-Framework" #Ersetze alle "rails" durch "Rails" Text.gsub!("rails", "Rails") #Schreibe den ersten Buchstaben jedes Vorkommens des Wortes "Rails" groß Text.gsub!(/\brails\b/, "Rails") puts "#{text}"

Ausprobieren »

Die Ausgabe des obigen Beispiels ist:

Rails 是 Rails,  Ruby on Rails 非常好的 Ruby 框架
Weitere Erweiterungen