Ruby在数组中按模式搜索字符串

时间:2013-02-28 14:26:33

标签: ruby string search vector match

我在Ruby中有一个像这样的载体

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

我想将字符串'filex.rc'与此向量进行比较并匹配它们。我想匹配它们,因为它们具有相同的模式(名称以.rc结尾)。

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

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

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

2 个答案:

答案 0 :(得分:1)

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

首先将它转换为regexp数组:

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 

答案 1 :(得分:1)

那里有一个逻辑上的差距:你默默地假设模式要匹配,如果它们出现在给定字符串的末尾,如果它们位于中间/开始则不匹配。我想您不希望file1.rb.origfile1.rb匹配,不是吗?

因此,如果您想使用真正的正则表达式,则需要使用以下命令重新定义匹配列表:

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

如果您希望file1.rb~a模式匹配,请保持原样。

现在我们可以写:

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

它返回所有匹配项,因此,如果返回的数组不为空,则成功匹配。