带有命名捕获组的正则表达式在Ruby中获得所有匹配

我有一个字符串:

s="123--abc,123--abc,123--abc"

我尝试使用Ruby 1.9的新功能“命名组”来获取所有命名的组信息:

/(?<number>d*)--(?<chars>s*)/

是否有像Python的findall这样的API返回matchdata集合? 在这种情况下,我需要返回两个匹配,因为123abc重复两次。 每个匹配数据包含每个命名捕获信息的详细信息,因此我可以使用m['number']来获取匹配值。


命名捕捉仅适用于一个匹配结果。
Ruby的findall类似于String#scan 。 您可以使用scan结果作为数组,或将一个块传递给它:

irb> s = "123--abc,123--abc,123--abc"
=> "123--abc,123--abc,123--abc"

irb> s.scan(/(d*)--([a-z]*)/)
=> [["123", "abc"], ["123", "abc"], ["123", "abc"]]

irb> s.scan(/(d*)--([a-z]*)/) do |number, chars|
irb*     p [number,chars]
irb> end
["123", "abc"]
["123", "abc"]
["123", "abc"]
=> "123--abc,123--abc,123--abc"

超级迟了,但是这里有一个复制String#scan的简单方法,但是取得matchdata:

matches = []
foo.scan(regex){ matches << $~ }

现在matches包含与扫描字符串相对应的MatchData对象。


您可以使用names方法从正则表达式提取使用的变量。 所以我做的是,我使用常规scan方法来获得匹配,然后压缩名称和每个匹配来创建一个Hash

class String
  def scan2(regexp)
    names = regexp.names
    scan(regexp).collect do |match|
      Hash[names.zip(match)]
    end
  end
end

用法:

>> "aaa http://www.google.com.tr aaa https://www.yahoo.com.tr ddd".scan2 /(?<url>(?<protocol>https?)://[S]+)/
=> [{"url"=>"http://www.google.com.tr", "protocol"=>"http"}, {"url"=>"https://www.yahoo.com.tr", "protocol"=>"https"}]
链接地址: http://www.djcxy.com/p/74821.html

上一篇: Regex with named capture groups getting all matches in Ruby

下一篇: RegEx to check for string with given length containing special sequence