2021-07-08   ruby   regexp 

Rubyの正規表現でパターンマッチを使った繰り返し処理の例(gsubでブロックを使う)

BEFORE

この文章の中には、Markdownで**強調**される箇所があります。
**一行**の中に**複数回**出てくるかも知れませんし、
その**複数****箇所**は隣接しているかもしれません。
あるいはまた、**強調される箇所が、
複数行にまたがっている可能性**もあります。
もちろん、まったく強調されない行もあります。

AFTER

この文章の中には、Markdownで<b>強調</b>される箇所があります。
<b>一行</b>の中に<b>複数回</b>出てくるかも知れませんし、
その<b>複数</b><b>箇所</b>は隣接しているかもしれません。
あるいはまた、<b>強調される箇所が、
複数行にまたがっている可能性</b>もあります。
もちろん、まったく強調されない行もあります。

プログラム

text = <<"EOD"
この文章の中には、Markdownで**強調**される箇所があります。
**一行**の中に**複数回**出てくるかも知れませんし、
その**複数****箇所**は隣接しているかもしれません。
あるいはまた、**強調される箇所が、
複数行にまたがっている可能性**もあります。
もちろん、まったく強調されない行もあります。
EOD

html = <<"EOD"
この文章の中には、Markdownで<b>強調</b>される箇所があります。
<b>一行</b>の中に<b>複数回</b>出てくるかも知れませんし、
その<b>複数</b><b>箇所</b>は隣接しているかもしれません。
あるいはまた、<b>強調される箇所が、
複数行にまたがっている可能性</b>もあります。
もちろん、まったく強調されない行もあります。
EOD

def bold_loop(s)
  t = ''
  while s.match(/\*\*(.+?)\*\*/m)
    t += "#{$`}<b>#{$1}</b>"
    s = $'
  end
  t + s
end

def bold_block(s)
  s.gsub(/\*\*(.+?)\*\*/m) do
    "<b>#{$1}</b>"
  end
end

bold_loop(text) == html #=> true
bold_block(text) == html #=> true

参照

Gist

 2021-07-08   ruby   regexp