2013-02-28 65 views
-2

在我有这样一个红宝石通过搜索模式的字符串数组

a = ['.rc', '.res', 'file1.rb'] 

我想比较用这个载体的字符串“filex.rc”和匹配Ruby中的向量。我想匹配它们,因为它们具有相同的模式(名称使用.rc结束)。

另一个例子:如果我搜索字符串'1234.res'比较将返回true,当与我的向量相比,但如果我比较'123file1.rb'比较应该返回false。这就像一个正则表达式,我喜欢将我的向量中的某些模式与我的文本中的一些字符串进行比较。

那么,我该怎么做才能在Ruby中编写一个可以为我做的代码呢?

我希望我的问题很清楚。感谢所有的帮助。

+3

元素是什么类型?你目前的例子是一个语法错误。 – Linuxios 2013-02-28 14:28:52

+0

向量中的元素是字符串,但我不确定这些是否使用正确的类型,也许我们可以使用/ regex /?如果您愿意,您可以提出一些建议。 :) – 2013-02-28 14:31:33

回答

1

这里存在一个逻辑差距:你默默地认为模式如果发生在t他给出的字符串结束,如果他们在中间/开始时不匹配。我想你不想匹配file1.rb.origfile1.rb,不是吗?

所以,如果你想用真正的正则表达式,你是要重新定义你的匹配列表:

a = ['*.rc', '*.res', 'file1.rb'] 

如果你想对你的a模式file1.rb~比赛,不要动它。

现在我们可以这样写:

a.map { |m| m.gsub('*', '(.*)') }.reject { |m| (Regexp.new(m) =~ 'testfile.rc').nil? } 

它返回所有的比赛,因此,如果返回的数组不为空,你在匹配成功。

+0

谢谢。这个解决方案是我想要的更接近的解决方案。这还不完美,我抓住了一些案件,这是行不通的。但无论如何,感谢您的支持。很有用! – 2013-02-28 17:54:51

+0

不客气。由于我不知道实际案例是什么,我只是提供了真正的解决方案的框架。 – mudasobwa 2013-02-28 18:16:17

1

考虑到您在最后描述的用例,我将'file1.rb'更改为'^file1.rb$'。这样做,我们可以使用真正的正则表达式。

首先改造它在正则表达式的数组:

patterns = a.map { |element| Regexp.new element } 

然后建立一个正则表达式是所有正则表达式的工会:

re = Regexp.union(patterns) 

然后你可以用它

'filex.rc'.match re 
=> #<MatchData ".rc"> 

'123file1.rb'.match r 
=> #<MatchData "file1.rb"> 

'123file1.rb'.match r 
=> nil 
您的字符串匹配