it-swarm.com.de

Entspricht allen Vorkommen eines regulären Ausdrucks

Gibt es einen schnellen Weg, um jede Übereinstimmung eines regulären Ausdrucks in Ruby zu finden? Ich habe das Regex-Objekt in der STL Ruby=) durchgesehen und bei Google erfolglos gesucht.

566
Chris Bunch

Verwenden Sie scan , um Folgendes zu tun:

string.scan(/regex/)
796
Jean

Verwenden Sie zum Suchen aller übereinstimmenden Zeichenfolgen die Methode scan der Klasse String.

str = "A 54mpl3 string w1th 7 numb3rs scatter36 ar0und"
str.scan(/\d+/)
#=> ["54", "3", "1", "7", "3", "36", "0"]

Wenn Sie lieber MatchData möchten, welches der Typ des von match zurückgegebenen Objekts ist, Methode von Regexp Klassen, Verwenden Sie Folgendes

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 von MatchData ist, dass Sie Methoden wie offset verwenden können.

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]

Wenden Sie sich auch an diese Fragen, wenn Sie mehr wissen möchten
Wie erhalte ich die Übereinstimmungsdaten für alle Vorkommen eines Ruby regulären Ausdrucks in einer Zeichenfolge?
Ruby Regular Expression Matching Enumerator mit Unterstützung für Named Capture
So ermitteln Sie den Startpunkt für jedes Match in Ruby

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

62
sudo bangbang

wenn Sie einen regulären Ausdruck mit Gruppen haben:

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

Sie verwenden die Scan-of-String-Methode, um passende Gruppen zu finden:

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

So finden Sie ein passendes Muster:

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