1

在另一个线程中,我遇到了这个 Ruby 表达式:

str[%r{.*//(.*)}, 1]

这是什么语法?数字 1 是什么意思?

4

2 回答 2

7

这是一个带有 MatchData 的正则表达式切片

基本上,这会根据正则表达式对字符串进行索引,并返回第一个匹配组。例如:

str = 'http://example.com'
str[%r{.*//(.*)}, 1]
# => "example.com"

String#slice有这样的说法:

如果提供了 Regexp,则返回 str 的匹配部分。如果数字或名称参数跟随正则表达式,则返回 MatchData 的该组件。如果给出了一个字符串,那么如果它出现在 str 中,则返回该字符串。在这两种情况下,如果没有匹配项,则返回 nil。

于 2012-11-13T05:17:06.233 回答
1

您可以在 CodeGnome 的回答中看到正则表达式切片的解释。这里有一些关于 MatchData:str[%r{.*//(.*)}, 1]的内容等同于str.match(%r{.*//(.*)})[1],并且它们的工作方式相同。[]版本更清晰、更短。

MatchData 充当数组和/或散列,可以使用正常的索引技术进行访问。

m = /(.)(.)(\d+)(\d)/.match("THX1138.")  # m is a MatchData
# and m is   #<MatchData "HX1138" 1:"H" 2:"X" 3:"113" 4:"8">    in irb
m[0]   # "HX1138"
m[1]   # "H"
m[1..2]    #["H", "X"]
于 2012-11-13T05:27:55.410 回答