我试图通过一个字符串:
str = "foo chapter 1 bar v1 baz v2 qux chapter 2 quux v1"
并查找章节编号和诗句编号,例如("chapter 1 foo v1"
)。当我找到一个经文编号时,我想添加文字:
"id=\"(current chapter number)_(current verse number)\""
我的预期输出是:
"foo chapter 1 bar id=\"chapter_1_v1\" baz id=\"chapter_1_v2\" qux chapter 2 quux id=\"chapter_2_v1\""
使用split
删除任何未分割指定文本的文字。这是我的代码:
str.split(/(?=chapter \d+)/).each do |c|
c.scan(/(chapter) (\d+)/) {|chap, num| puts c.gsub(/(v\d+)/, 'id="' + chap.to_s + '_' + num.to_s + '_\1"')}
end
如何在拆分前保留文字?或者什么是实现这一结果的更好方法?
答案 0 :(得分:0)
您可以使用gsub!()直接替换每个匹配项的文本,而不是拆分。如果匹配chapter \d+
,只需存储该值并且不进行替换(替换为整个匹配)。
我将使用以下正则表达式匹配章节或诗句:
/\bchapter (\d+)|\b(v\d+)\b/
<强>代码:强>
c = "foo chapter 1 bar v1 baz v2 qux chapter 2 quux v1"
current_chapter = "1"
c.gsub!(/\bchapter (\d+)|\b(v\d+)\b/) { |match|
if ($1)
current_chapter = $1
match
else
"id=\"chapter_" + current_chapter + "_#$2\""
end
}
puts c
<强>输出:强>
foo chapter 1 bar id="chapter_1_v1" baz id="chapter_1_v2" qux chapter 2 quux id="chapter_2_v1"
免责声明:我从不在Ruby中编码,所以请考虑我使用的逻辑,知道脚本可能应该进行改进。 - 所有编辑都非常受欢迎!