http://www.perlmonks.org?node_id=826689

amir_e_a has asked for the wisdom of the Perl Monks concerning the following question:

Hello,

I am proofreading the WikiSource edition of Gesenius' Hebrew Grammar, a famous grammar book of the Biblical Hebrew language.

It has many references to the Bible using a MediaWiki template in this form: {{GHGbible-ref|book=Gn|chapter=2|verse=3}}; this creates a link to Genesis chapter 2 verse 3.

This template has already been used in many places where it is needed, but i want to put it automatically everywhere else. Basically, there are many pieces of text that go like this:

<p>this preposition appears in {{GHGbible-ref|book=Gn|chapter=2|verse=3}} and also in 4:5.</p>

I want to turn this into:

<p>this preposition appears in {{GHGbible-ref|book=Gn|chapter=2|verse=3}} and also in {{GHGbible-ref|book=Gn|chapter=4|verse=5}}.</p>

I can do it using this regex:

<p>s/(\{\{GHGbible-ref\|book=([^|]+)\|chapter=\d+\|verse=\d+\}\})(.+?)(\d+):(\d+)/$1$3{{GHGbible-ref|book=$2|chapter=$4|verse=$5}}/</p>

The problem: sometimes the source text is

<p>this preposition appears in {{GHGbible-ref|book=Gn|chapter=2|verse=3}} and also in {{GHGbible-ref|book=Ru|chapter=4|verse=5}} and 4:5.</p>

I want to turn this into:

<p>this preposition appears in {{GHGbible-ref|book=Gn|chapter=2|verse=3}} and also in {{GHGbible-ref|book=Ru|chapter=4|verse=5}} and {{GHGbible-ref|book=Ru|chapter=4|verse=5}}.</p>

... but the previous regex turns this into

<p>this preposition appears in {{GHGbible-ref|book=Gn|chapter=2|verse=3}} and also in {{GHGbible-ref|book=Ru|chapter=4|verse=5}} and {{GHGbible-ref|book=Gn|chapter=4|verse=5}}.</p>

If you don't spot the difference, then it's in the book part: I want 'Ru' and not 'Gn', i.e. the book value of the last GHGbible-ref before (\d+):(\d+), not the first one.

I probably have to modify the (.+) part so it doesn't match GHGbible-ref, or something like that, but i can't think of a way to do it.

Thanks in advance.