Gibt es eine schnelle Möglichkeit, jede Übereinstimmung eines regulären Ausdrucks in Ruby zu finden? Ich habe das Regex-Objekt in der Ruby STL durchgesehen und erfolglos bei Google gesucht.
Antworten
Zu viele Anzeigen?Um alle übereinstimmenden Zeichenketten zu finden, verwenden Sie Strings scan
Methode.
str = "A 54mpl3 string w1th 7 numb3rs scatter36 ar0und"
str.scan(/\d+/)
#=> ["54", "3", "1", "7", "3", "36", "0"]
Wenn Sie wollen, MatchData
der der Typ des Objekts ist, das von der Regexp match
Methode, verwenden:
str.to_enum(:scan, /\d+/).map { Regexp.last_match }
#=> [#<MatchData "54">, #<MatchData "3">, #<MatchData "1">, #<MatchData "7">, #<MatchData "3">, #<MatchData "36">, #<MatchData "0">]
Der Vorteil der Verwendung von MatchData
ist, dass Sie Methoden wie offset
:
match_datas = str.to_enum(:scan, /\d+/).map { Regexp.last_match }
match_datas[0].offset(0)
#=> [2, 4]
match_datas[1].offset(0)
#=> [7, 8]
Wenn Sie mehr wissen möchten, lesen Sie diese Fragen:
- " Wie erhalte ich die Übereinstimmungsdaten für alle Vorkommen eines regulären Ruby-Ausdrucks in einer Zeichenkette? "
- " Ruby Regular Expression Matching Enumerator mit Named Capture Unterstützung "
- " Wie man den Startpunkt für jedes Match in Ruby herausfindet "
Lesen über spezielle Variablen $&
, $'
, $1
, $2
in Ruby wird ebenfalls hilfreich sein.
Sie können verwenden string.scan(your_regex).flatten
. Wenn Ihr Regex Gruppen enthält, wird er in einem einzigen einfachen Array zurückgegeben.
string = "A 54mpl3 string w1th 7 numbers scatter3r ar0und"
your_regex = /(\d+)[m-t]/
string.scan(your_regex).flatten
=> ["54", "1", "3"]
Regex kann auch eine benannte Gruppe sein.
string = 'group_photo.jpg'
regex = /\A(?<name>.*)\.(?<ext>.*)\z/
string.scan(regex).flatten
Sie können auch Folgendes verwenden gsub
Wenn Sie MatchData wollen, ist das nur eine weitere Möglichkeit.
str.gsub(/\d/).map{ Regexp.last_match }