2013-02-28 114 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 
您的字符串匹配