有没有快速找到Ruby中正则表达式匹配的方法?我查看了Ruby STL中的Regex对象,并在Google上搜索无济于事。
答案 0 :(得分:786)
使用scan
应该可以解决问题:
string.scan(/regex/)
答案 1 :(得分:57)
要查找所有匹配的字符串,请使用String
类的scan
方法。
str = "A 54mpl3 string w1th 7 numb3rs scatter36 ar0und"
str.scan(/\d+/)
#=> ["54", "3", "1", "7", "3", "36", "0"]
如果您希望MatchData
Regexp
类的match
方法返回的对象的类型,请使用以下
str.to_enum(:scan, /\d+/).map { Regexp.last_match }
#=> [#<MatchData "54">, #<MatchData "3">, #<MatchData "1">, #<MatchData "7">, #<MatchData "3">, #<MatchData "36">, #<MatchData "0">]
拥有MatchData
的好处是您可以使用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]
如果您想了解更多信息,请参阅这些问题
How do I get the match data for all occurrences of a Ruby regular expression in a string?
Ruby regular expression matching enumerator with named capture support
How to find out the starting point for each match in ruby
在ruby中阅读特殊变量$&
,$'
,$1
,$2
将非常有帮助。
答案 2 :(得分:11)
如果你有一个带有组的正则表达式:
str="A 54mpl3 string w1th 7 numbers scatter3r ar0und"
re=/(\d+)[m-t]/
使用scan of string方法查找匹配的组:
str.scan re
#> [["54"], ["1"], ["3"]]
找到匹配的模式:
str.to_enum(:scan,re).map {$&}
#> ["54m", "1t", "3r"]
答案 3 :(得分:-1)
您可以使用string.scan(your_regex).flatten
。如果您的正则表达式包含组,它将以单个普通数组形式返回。
string = "A 54mpl3 string w1th 7 numbers scatter3r ar0und"
your_regex = /(\d+)[m-t]/
string.scan(your_regex).flatten
=> ["54", "1", "3"]
正则表达式也可以是命名组。
string = 'group_photo.jpg'
regex = /\A(?<name>.*)\.(?<ext>.*)\z/
string.scan(regex).flatten
您还可以使用gsub
,这是您想要MatchData的另一种方式。
str.gsub(/\d/).map{ Regexp.last_match }