红宝石和正则表达式分组

时间:2015-03-26 18:23:44

标签: ruby regex

这是代码

string = "Looking for the ^[cows]"
footnote = string[/\^\[(.*?)\]/]

我希望footnote等于cows

我得到的是footnote等于^[cows]

任何帮助?

谢谢!

4 个答案:

答案 0 :(得分:4)

您可以使用second argument[]指定所需的捕获组:

string = "Looking for the ^[cows]"
footnote = string[/\^\[(.*?)\]/, 1]
# footnote == "cows"

答案 1 :(得分:0)

如果要捕获子组,可以使用Regexp#match

r = /\^\[(.*?)\]/
r.match(string) # => #<MatchData "^[cows]" 1:"cows">
r.match(string)[0] # => "^[cows]"
r.match(string)[1] # => "cows"

答案 2 :(得分:0)

根据String documentation#[]方法接受第二个参数,一个整数,它确定返回的匹配组:

a = "hello there"

a[/[aeiou](.)\1/]      #=> "ell"
a[/[aeiou](.)\1/, 0]   #=> "ell"
a[/[aeiou](.)\1/, 1]   #=> "l"
a[/[aeiou](.)\1/, 2]   #=> nil

您应该使用footnote = string[/\^\[(.*?)\]/, 1]

答案 3 :(得分:0)

使用捕获组,然后检索其内容的替代方法是仅匹配您想要的内容。这有三种方法。

#1使用积极的外观和积极的前瞻

string[/(?<=\[).*?(?=\])/]
  #=> "cows"  

#2使用匹配但遗忘(\K)和积极向前看

string[/\[\K.*?(?=\])/]
  #=> "cows"  

#3使用String#gsub

string.gsub(/.*?\[|\].*/,'')
  #=> "cows"