Ruby Regexp组匹配,怎么在1行上分配变量?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (20)

我目前正在尝试将一个字符串重命名为多个变量。示例字符串:

ryan_string = "RyanOnRails: This is a test"

我把它和这个regexp匹配起来,有三个组:

ryan_group = ryan_string.scan(/(^.*)(:)(.*)/i)

现在,要访问每个组,我必须这样做:

ryan_group[0][0] (first group) RyanOnRails
ryan_group[0][1] (second group) :
ryan_group[0][2] (third group) This is a test

这听起来很荒谬,感觉好像我做错了什么。我希望能这样:

g1, g2, g3 = ryan_string.scan(/(^.*)(:)(.*)/i)

这有可能吗?

提问于
用户回答回答于

你不想要scan这个,因为它没有什么意义。您可以使用String#match,会返回一个MatchData对象,然后可以调用#captures返回一个捕获数组。像这样:

#!/usr/bin/env ruby

string = "RyanOnRails: This is a test"
one, two, three = string.match(/(^.*)(:)(.*)/i).captures

p one   #=> "RyanOnRails"
p two   #=> ":"
p three #=> " This is a test"

请注意,如果找不到匹配项,String#match将返回零,因此这样可能会更好:

if match = string.match(/(^.*)(:)(.*)/i)
  one, two, three = match.captures
end

虽然scan对此没有多大意义。它仍然可以完成这项工作,你只需要先将返回的数组展平。one, two, three = string.scan(/(^.*)(:)(.*)/i).flatten

用户回答回答于

你可以使用Match或=〜来代替它,它会给你一个单独的匹配,你可以用相同的方式访问匹配数据,或者使用特殊匹配变量$ 1,$ 2,$ 3

就像是:

if ryan_string =~ /(^.*)(:)(.*)/i
   first = $1
   third = $3
end

扫码关注云+社区