2015-07-28 78 views
0

tl; dr:如何在Ruby中的正則表達式匹配中僅替換特定字符(即換行符)?我有一個字符串數組。數組中的每個元素都有2到4個單詞(=任何字符序列),並按特定順序分隔空格。使用正則表達式替換捕獲組中的發生次數

我也有一個很大的字符串,我想檢查那些由\ n而不是空格分開的單詞序列的實例。例如,我想將數組的元素匹配:

arr[0] = "aaa bbbb ccccc" 

到看起來像這樣的字符串:

zzzzzzzzz aaa\n 
bbbb ccccc yyyyyyyyy 

,使它看起來像這樣:

zzzzzzzzz aaa bbbb ccccc yyyyyyyyy 

的事情是,我至少可以想到兩種做法,但它們看起來非常麻煩。我會做的是:

  1. 替換[\ n]的陣列中的每個空間
  2. 產生與Regexp.union包括陣列
  3. 的所有元素一個正則表達式使用正則表達式來匹配的實例我字符串中的arr元素
  4. 生成.gsub!爲每個字符串,以便它不會取代整個匹配,但只匹配元素(或使用多個捕獲組)

但是,我懷疑這是一個相當愚蠢的方式來做到這一點。有沒有辦法在Ruby中做到這一點,而不是「周圍」?


編輯:如何用regexp.union實現下面的答案?我有一個生成的正則表達式的函數:

def generateMergeRx(arr_with_keywords) 
    arr_with_keywords.delete_if{|x| (x.include? " ") == false} 
    matchRegexMerge = Regexp.new("(%{keywordReplace})" % { 
     keywordReplace: Regexp.union(arr_with_keywords).source 
    }) 
end 

這是它看起來像使用看跌期權regexMerge.to_s:

(?-mix:(And\.\ z\ Kobyl\.|Ban\.\ W\.|B\.\ B\.|B\.\ G\.|Biel\.\ J\.) 

它對應於:

And. z Kobyl. 
Ban. W. 
B. B. 
B. G. 
Biel. J. 
(...) 

然後我這樣稱呼:

regexMerge = generateMergeRx arr_with_keywords 
some_string.gsub!(regexMerge.to_s.gsub!(/ /, "\s"), "\\1") 

但是我應該把什麼,而不是\ 1?因爲此刻輸入=輸出。

回答

2
▶ str = 'zzzzzzzzz aaa 
▷ bbbb ccccc yyyyyyyyy' 
▶ re = "aaa bbbb ccccc" 
▶ str.gsub /#{re.gsub(/ +/, '\s+')}/, re 
#⇒ "zzzzzzzzz aaa bbbb ccccc yyyyyyyyy" 

的總體思路是,以匹配任何空間,包括\n並將其與原始字符串替換。

+0

哦,是的,這正是我一直在尋找 - 和更明顯的比我願意承認...謝謝! – MrVocabulary

+0

歡迎您。 – mudasobwa

+0

其實,我有實現這個想法的問題一點點。你介意看一下嗎?我更新了上面的描述。 – MrVocabulary

相關問題