in reply to Re: wiki regex reprocessing replacement
in thread wiki regex reprocessing replacement

Here's a non-recursive way which I think fits your criteria:

use strict; use warnings; use Test::More; my $wiki = '_/one *two*/ three_ null _/four *five*/ six_ null _/seven *eight +*/ nine_'; my $expected = '<u><i>one <b>two</b></i> three</u> null <u><i>four <b>five</b></i +> six</u> null <u><i>seven <b>eight</b></i> nine</u>'; my %h = ( '*' => 'b' , '/' => 'i' , '_' => 'u' , ); my $DBG = 1; sub flip { my $s = shift; my $z = $h{$s}; $h{$s} = $z =~ /\// ? substr ($z, 1, 1) : "/$z"; return "<$z>"; } sub tf { diag "Pre: '$_'\n\n" if $DBG; s{([_*/])}{flip($1)}eg }; $_ = $wiki; diag "IN <= '$wiki'\n\n" if $DBG; tf(); is ($_, $expected, " repeated replace works"); done_testing;

Replies are listed 'Best First'.
Re^3: wiki regex reprocessing replacement
by LanX (Cardinal) on Feb 15, 2020 at 17:12 UTC
    Many thanks, :)

    ... but ...

    The testsuite should have also included markup which must not be replaced

    My fault sorry, I thought it's obvious by the $pre and $post regex.

    The markup must come in pairs and be embraced by special word boundaries.

    (whitespace or other markup or tag-brackets or ... depending on pre/post)

    Hence a _ inside a word is forbidden, which makes sense for joined_identifiers .

    I've updated the tests in Re: wiki regex reprocessing replacement (UPDATED^2) with markup to ignore

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    Wikisyntax for the Monastery

      My fault sorry, I thought it's obvious by the $pre and $post regex.

      I noticed that they were of no use to the sample dataset so just applied Occam's Razor to them. Given the new(ly stated) criteria and the extra complications those entail I'm happy to wait for tybalt89's solution*.

      *which has appeared even as I was typing this. Top work!