在另一个线程中,我遇到了这个 Ruby 表达式:
str[%r{.*//(.*)}, 1]
这是什么语法?数字 1 是什么意思?
基本上,这会根据正则表达式对字符串进行索引,并返回第一个匹配组。例如:
str = 'http://example.com'
str[%r{.*//(.*)}, 1]
# => "example.com"
String#slice有这样的说法:
如果提供了 Regexp,则返回 str 的匹配部分。如果数字或名称参数跟随正则表达式,则返回 MatchData 的该组件。如果给出了一个字符串,那么如果它出现在 str 中,则返回该字符串。在这两种情况下,如果没有匹配项,则返回 nil。
您可以在 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"]