我有一个文档,并将其存储为单个字符串。我需要从文档中提取某些文本块,并在这些块中(但绝不要在它们之外!)修改与另一个正则表达式匹配的行。具体来说,我的目标是使用任意字符串替换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#[]
返回了一个新字符串。