拆分省略

时间:2015-09-24 14:53:59

标签: ruby regex split

我试图通过一个字符串:

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

如何在拆分前保留文字?或者什么是实现这一结果的更好方法?

1 个答案:

答案 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"

DEMO

免责声明:我从不在Ruby中编码,所以请考虑我使用的逻辑,知道脚本可能应该进行改进。 - 所有编辑都非常受欢迎!