2015-05-22 89 views
1

在陣列項目我有這個工作對我的數組:語法拒絕與正則表達式

my_arr.delete_if{|x| x=~/achievement\..*?/} 

它刪除匹配模式的achievement.陣列中的所有字符串。是否有一個相似的襯墊做反向(只接受包含achievement.字符串?

+0

在您的搜索中沒有任何東西需要使用正則表達式,因爲它會減慢您的代碼。使用'x ['achievement。']'而不是因爲子字符串搜索比未錨定的正則表達式更快。 –

+0

@TinMan,這只是一個例子。我有幾十個這些大多數需要正則表達式,雖然你是正確的,但這不是。 – Rilcon42

回答

5

使用Array#keep_if代替#delete_if

my_arr.keep_if{|x| x=~/achievement\..*?/} 
+0

不錯,比@Yu提出的要好得多。 –

+0

我知道,看不到這會怎麼樣... –

1

好,更好的解決方案肯定是使用keep_if

的OP詢問是否有辦法

只接受字符串包含

所以,是的,又不是最好的方式,但你可以使用負前瞻「政績」:(?!exp)

my_arr.delete_if{|x| x=~/(?!achievement\..*?)/} 

進一步的替代方案中,仍然使用delete_if是使用「不等於匹配」運算符(感謝@Cary):

my_arr.delete_if{|x| x!~/achievement\..*?/} 

再次,由於@Cary,用於指出這是不愉快的邏輯在任何人的代碼,以找到這麼使用keep_if

+0

爲什麼你會喜歡這個簡單的'x!〜/ achievement \ .. *?/'? –

+0

@CarySwoveland啊,我正在想這個語法,謝謝!添加。 – jcuenod

+0

實際上,我並不是在暗示,如果條件不成立,刪除頭髮的呼吸就是保持相同的條件。當'select'已經被提出時,它與提示'reject'一樣 - 它不會添加任何東西。至於看起來,我不明白爲什麼會考慮這一點。 –

2

無需修改正則表達式,您可以使用Array#keep_if

my_arr.keep_if{|x| x=~/achievement\..*?/} 
+0

晚了7秒。 Yu,你失敗了。即使間距也是一樣的。你和@羅伯特有一個思想融合?除此之外,我更喜歡你的解決方案。 –