了解模式匹配在Ruby 2中的工作原理

时间:2010-06-22 05:32:52

标签: ruby pattern-matching

我不知道Ruby 2中的模式匹配是如何工作的。

我有以下值targetfilename = /mnt/usb/mpeg4Encoded.mpeg4

我的模式匹配if-else因此:

if (targetfilename.match(/^\//))
  puts "amit"
else 
  puts "ramit"

输出为ramit

我不明白这种模式匹配是如何工作的。

1 个答案:

答案 0 :(得分:1)

if targetfilename.match(/^V/)
  puts "amit"
else
  puts "ramit"
end

# result:
# "amit"

这是为什么?这是因为targetfilename.match(/^V/)输出Matchdata对象(单击链接以获取此对象的完整描述)。这是一个包含“匹配”中所有信息的对象。如果没有匹配,则不返回MatchData对象,因为没有任何内容可以返回。相反,你得到nil

当您使用if时,如果它尝试比较nil,则会将其视为与false相同的方式。

基本上,任何“实际”值(false除外)的处理方式与true相同。基本上,它要求

if (there's anything here)
  do_this
else
  do_something_else
end

再次,让我重申一下:

如果if之后的内容是 false nil ,则if语句会解析为“else”。 如果它是其他任何东西,它就会解析,好像它已经获得了“真实”声明。


正则表达式

/^V/是所谓的“正则表达式”; //是Regexp文字,与""是字符串文字的方式相同,Regexp由Regexp类表示,与String类表示字符串的方式相同。

实际的“正则表达式”是斜杠之间的内容 - ^V。这是说:

  • ^:字符串的开头
  • V:大写字母V

因此,/^V/将匹配字符串开头的大写字母“V”的任何情况。

还有什么可以放在正则表达式中?有什么特殊字符?试试这个regexp cheat sheet

另外,一些很棒的工具:

  • Rubular - 输入正则表达式,然后输入相同的文字,看看匹配的内容。
  • Strfriend - 输入正则表达式并以“直观”表示。