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

Hello

Is there a way of writing a regex that converts the below text as follows.

"This example could be another example where the example is the example I wanted"

"This example_1 could be another example_2 where the example_3 is the example_4 I wanted"

Thanks

Mark

Replies are listed 'Best First'.
Re: Incremental replacement by regex
by cdarke (Prior) on Feb 21, 2011 at 13:26 UTC
    use strict; use warnings; my $str = "This example could be another example where the example is +the example I wanted"; my $i = 0; $str =~ s/example/'example_'.++$i/eg; print "$str\n";
    Gives:
    This example_1 could be another example_2 where the example_3 is the e +xample_4 I wanted
    At the end of the substitution statement, the 'e' executes the code and the 'g' repeats the substitution for the next occurrence of the string. The ++ is the prefix operator, so it is executed before the rest of the statement.
      :-)

      I was sure I tried single quotes. But it was the e modifier that I needed. Thanks

      This was my effort in the end

      my $t = "This example could be another example where the example is th +e example I wanted\n"; my $count = 0; while($t =~ /example\s/){ my $example = "example_".++$count; $t =~ s/(example\s)/$example /; print $t; } print $t;
        The 'g' in my example removes the need for the loop. One slightly pedantic comment on your code, you use \s and you should remember that it matches all whitespace, including a new-line. So, for example:
        my $t = "This example could be another example where the example is th +e example I wanted, for example\n";
        removes the trailing "\n" and replaces it with a space, which is probably not what you want.
Re: Incremental replacement by regex
by ww (Archbishop) on Feb 21, 2011 at 13:55 UTC
    markdibley

    One answer would be "yes."

    Of course, that's not very helpful (minimally helpful, yes, but not "very helpful).

    Another answer would be "yes, many ways (c.f. TIMTOWTDI).

    But that's not a lot better than the first... except -- perhaps -- that it hints at the notion of exploring documentation (starting, perhaps with perldoc perldoc and moving on to the various regex related items perldoc perlretut and Tutorials (here and elsewhere).

    If you're very new to Perl though, a few hints on where to look for your answer may be invaluable (as they were for me, not so many years ago):

    The simplest to grok (but not the best or more efficient) might be to consider using a regex to capture every instance of "example" and every instance of words NOT eq "example" to an array; then foreach your way thru that, testing for "example" and appending the value of an incrementing $i before printing the array element.

    A better way would be to search the (documentation, nodes, books at your disposal) for how to make a regex treat some part thereof as code; that is, to perldoc -f eval an expression.

    And, since it seems to need to be said, please read On asking for help with emphasis on the Monastery's view that SOPW should demonstrate your effort so far.

      Well, as I said, it was the e modifier I was missing. I had done plenty of searches and had indeed read various parts of perlretut such as

      http://perldoc.perl.org/perlretut.html#A-bit-of-magic%3a-executing-Perl-code-in-a-regular-expression

      and
      http://groups.google.com/group/perl.beginners/browse_thread/thread/a11b27b5c5efb6ae

      http://www.google.co.uk/search?sourceid=chrome&ie=UTF-8&q=regex+increment

      Please could you suggest ways of searching for something in a way that answers the question when you are not exactly sure how to phrase the question. That would be better than telling me to read the documentation that I have just searched.

      I thought the philosphy here was "A stupid question is an unasked question". Not "let me waste my time telling you to read the manual while I sit all smug because I know all the answers".

      My apologies if I have misinterpreted your reply. Thank you very much for your helpful suggestions.
        No apologies needed, but my intent (which seems to have miscarried) was to provide some hints on where/how to search.

        But to the general question "how does one search for something which one lacks the vocabulary to describe?" ... I hasten to admit, I don't really know. Some days, thrashing around amongst words that pop into my head as "maybe related" works like a charm; other days -- well, it's a lot more slogging and questions as broad as your OP.

        And please -- take this as kindly-intentioned advice about the Monastery norms rather than as 'harsh:' had you cited originally the research that you've now posted in the reply, I might have answered differently -- with, for example, a direct link to a section of perlretut or some other document, because it would have been obvious that had made significant and well-directed effort.

Re: Incremental replacement by regex
by JavaFan (Canon) on Feb 21, 2011 at 14:49 UTC
    Assuming the target string is in $_:
    my $i; s/example\K/'_' . ++$i/eg;
Re: Incremental replacement by regex
by Anonymous Monk on Feb 21, 2011 at 13:25 UTC
    No, but you could craft a substitution to get the effect
    $_ = 'I say blah blah blah to you.'; s/blah/ $i++ /eg; print; __END__ I say 0 1 2 to you.
    perlretut