656 Stimmen

Wie man alle Vorkommen einer Regex abgleicht

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.

899voto

Jean Punkte 20911

Verwendung von scan sollte das genügen:

string.scan(/regex/)

91voto

sudo bangbang Punkte 23220

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:

Lesen über spezielle Variablen $& , $' , $1 , $2 in Ruby wird ebenfalls hilfreich sein.

15voto

MVP Punkte 941

Wenn Sie eine Regexp mit Gruppen haben:

str="A 54mpl3 string w1th 7 numbers scatter3r ar0und"
re=/(\d+)[m-t]/

können Sie Strings scan Methode, um passende Gruppen zu finden:

str.scan re
#> [["54"], ["1"], ["3"]]

Um das passende Muster zu finden:

str.to_enum(:scan,re).map {$&}
#> ["54m", "1t", "3r"]

8voto

Datt Punkte 703

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 }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X