Ruby:如何使用别名修改字符串的一部分

时间:2018-08-21 14:03:58

标签: ruby regex string

我有一个文档,并将其存储为单个字符串。我需要从文档中提取某些文本块,并在这些块中(但绝不要在它们之外!)修改与另一个正则表达式匹配的行。具体来说,我的目标是使用任意字符串替换E_DISCLAIMER匹配的块中的空行。是否可以获取对子字符串的引用,以便我只能将String#gsub应用于字符串中的该范围?

这是到目前为止我能想到的:

def disambiguate_blanks(text)
    # 1. scan for blocks between separators
    # 2. match blocks against document to get starting index
    # 3. extract matched blocks using start + length
    # 4. tag blank lines in blocks by appending a special string
    matchdata = text.scan(E_DISCLAIMER)
    blocks = matchdata.map(&:join).map(&:gsub(/^[=_*]+|[=_*]+$/, ""))
    matched_blocks = blocks.reduce(Hash.new) { |h, b| 
        h[b] = text.index(b)
        h
    }
    extracted_blocks = []
    matched_blocks.each { |block, start| 
        eb = text[start..start + block.size]
        extracted_blocks << eb
    }
    extracted_blocks.each { |eb|
        eb.gsub!(/(^)(\n)/, '\1::EMPTY::\2') 
    }
    return text
end

这个想法是要使最后一个块中应用的更改也适用于text。目前情况并非如此,因为String#[]返回了一个新字符串。

0 个答案:

没有答案