Ruby:在条件块中使用条件结果

时间:2011-12-27 17:16:55

标签: ruby regex

我有这样的代码

reg = /(.+)_path/
if reg.match('home_path')
    puts reg.match('home_path')[0]
end

这将eval正则表达式两次:( 所以......

reg = /(.+)_path/
result = reg.match('home_path')
if result
    puts result[0]
end

但是它会将变量结果存储在内存中直到。 我有一个功能编程的想法

/(.+)_path/.match('home_path').compact.each do |match|
    puts match[0]
end

但似乎应该有更好的解决方案,不是吗?

6 个答案:

答案 0 :(得分:7)

有一些特殊的全局变量(它们的名称以$开头),其中包含最后一个正则表达式匹配的结果:

r = /(.+)_path/

# $1 - the n-th group of the last successful match (may be > 1)
puts $1 if r.match('home_path')
# => home 

# $& - the string matched by the last successful match
puts $& if r.match('home_path')
# => home_path

您可以找到预定义全局变量的完整列表here

注意,在上面的示例中,如果传递的字符串与正则表达式不匹配,则根本不会执行puts

谈到一般情况,你总是可以把任务分配到条件本身:

if m = /(.+)_path/.match('home_path')
  puts m[0]
end

尽管如此,很多人不喜欢这样,因为它使代码的可读性降低,并且提供了混淆===的好机会。

答案 1 :(得分:6)

我个人最喜欢的(w / 1.9+)是一些变体:

if /(?<prefix>.+)_path/ =~ "home_path"
   puts prefix
end

如果你真的想要一个单行:puts /(?<prefix>.+)_path/ =~ 'home_path' ? prefix : false

有关命名捕获的一些限制和#=~,请参阅Ruby Docs

答案 2 :(得分:6)

来自docs如果给出了一个块,如果匹配成功,则使用MatchData调用该块

所以:

/(.+)_path/.match('home_path') { |m| puts m[1] }  # => home

/(.+)_path/.match('homepath') { |m| puts m[1] }  # prints nothing

答案 3 :(得分:2)

怎么样......

if m=/regex here/.match(string) then puts m[0] end

一个简洁的单行解决方案,我想:)

答案 4 :(得分:1)

怎么样?

puts $~ if /regex/.match("string")

$~是一个特殊变量,用于存储最后一个正则表达式匹配。更多信息:http://www.regular-expressions.info/ruby.html

答案 5 :(得分:0)

实际上,这可以在没有条件的情况下完成。 (如果没有匹配,则表达式的计算结果为""。)

puts /(.+)_path/.match('home_xath').to_a[0].to_s