红宝石包括,动态字母和符号

时间:2013-06-21 15:02:13

标签: ruby parsing

假设我构建了一个这样的数组:

:001 > holder = "This.File.Q99P84.Is.Awesome"
=> "This.File.Q99P84.Is.Awesome" 
:002 > name = holder.split(".")
=> ["This", "File", "Q99P84", "Is", "Awesome"]

现在,我可以这样做:

name[2].include? 'Q99P84' 

而不是放入'Q99P84',我想要输入'Q符号后面跟' 数字的符号,数字的符号,P的符号,数字的符号,数字的符号
所以.include?功能将是动态的。因此,我加载的任何具有Q ## P ##的文件名都将返回true

我很确定这可能是我不知道究竟要搜索什么。如果您知道答案,可以将我链接到文档。

2 个答案:

答案 0 :(得分:3)

您正在寻找的是正则表达式匹配。 Ruby regexp object会帮助你。你想要的是像

/Q[\d+]P[\d+]/.match(name[2])

...如果name[2]的字符串与字符Q,一个或多个数字(0-9),字符P匹配,则会返回真值一个或多个数字。如果你想要的模式在这些数字空格中只有两位数,那么匹配可能太灵活了;为此您可以尝试更具体的模式:

/Q\d\dP\d\d/.match(name[2])

答案 1 :(得分:0)

一种方法是通过正则表达式(简称“正则表达式”)。两个很好的信息来源是Regular Expression.infoRubular,它们更加以Ruby为中心。

在字符串上使用正则表达式的一种方法是String#match方法:

names[2].match(/Q\d\dP\d\d/) # /d stands for digit 

如果匹配则返回字符串,如果没有则返回nil

"Q42P67".match(/Q\d\dP\d\d/) #=> "Q42P67"
"H33P55".match(/Q\d\dP\d\d/) #=> nil

这在if条件下很有用,因为返回的字符串是'truthy'而nil是'falsely'。

names[2] = "Q42P67"
if names[2].match(/Q\d\dP\d\d/)
   # Will execute code here
end

names[2] = "H33P55"
if names[2].match(/Q\d\dP\d\d/)
   # Will not execute code here
end

我希望这会有所帮助,直到你深入研究正则表达式。

修改 请注意/Q\d\dP\d\d/中的Q和P是大写字母。如果情况不重要,您可以为不区分大小写添加“i”。 /Q\d\dP\d\d/i将捕获“Q42P67”和“q42P67”