使用Regex替换捕获组中的出现

时间:2015-07-28 11:08:55

标签: arrays ruby regex string

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. 替换数组中的每个空格
  3. 使用包含数组所有元素的Regexp.union生成正则表达式
  4. 使用正则表达式匹配字符串
  5. 中我的arr元素的实例
  6. 生成一个.gsub!对于每个字符串,以便它不会替换整个匹配,而只替换匹配的元素(或使用多个捕获组)
  7. 但是,我怀疑这是一种相当愚蠢的方式。有没有办法在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
    

    这就像使用puts 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?因为此时输入=输出。

1 个答案:

答案 0 :(得分:2)

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

一般的想法是匹配任何空格,包括\n,并用原始字符串替换它们。