Edited at

正規表現で最後にmatchするものだけを置き換える

More than 1 year has passed since last update.

最後にmatchするものだけを置き換えたい場合です。

最後にmatchするものは解釈によって異なります。

text = "むふふうふふふ"

こちらで「ふふ」を置き換えしたい場合、末尾の「ふふ」のmatchする部分を前方にするのか、最後尾にするのかで異なります。

パターンによって方法が異なるので、分けて説明します。


前方にmatchする方法

reverseを用いる方法

text = "foobarbazfoobarbazfoobarbaz"

text.reverse.sub("foo".reverse, 'FOO'.reverse).reverse
=> "foobarbazfoobarbazFOObarbaz"

否定先読みを用いる方法

text = "foobarbazfoobarbazfoobarbaz"

text.sub(/foo(?!.*foo)/m, 'Foo')
=> "foobarbazfoobarbazFOObarbaz"


最後尾にmatchする方法

(.*)を用いる方法

text = "foobarbazfoobarbazfoobarbaz"

text.sub(/(.*)foo/m, '\1Foo')
=> "foobarbazfoobarbazFOObarbaz"

text = "むふふうふふふ"

text.sub(/(.*)ふふ/m, '\1*')
=> "むふふうふ*"

結構マニアックな使い方だと思います。

他にやり方があれば、教えて下さい:bow:

kanpou_さん、scivolaさん、ありがとうございます!