2015-07-28 63 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