in reply to more efficient regular expression please

This seems to do what you want, if I understand you correctly.

$line =~ s[v?a?c?a?t?i?o?n\.msg][];

Update: Right idea, wrong execution. See 271190 below :( I think this is better.

$line =~ s[(?:(?:(?:(?:(?:(?:v?a)?c)?a)?t)?i)?o)?n.msg][];

Test code

#! perl -slw use strict; # Set up some test data. my $text = 'The quick brown fox jumps over the lazy dog'; my @tests = map{ my $t = $text; substr($t, rand( length $text ), 0 ) = $_; $t; } map{ substr 'vacation.msg', $_ } 0 ..6; print "Before\n"; print for @tests; # s[v?a?c?a?t?i?o?n\.msg][] for @tests; print "\nAfter\n"; print for @tests; __END__ P:\>junk Before The quick vacation.msgbrown fox jumps over the lazy dog The quick brown fox jumps over the laacation.msgzy dog The quick bcation.msgrown fox jumps over the lazy dog Theation.msg quick brown fox jumps over the lazy dog The quick brown fotion.msgx jumps over the lazy dog The quick brown fox jumps ovion.msger the lazy dog Thon.msge quick brown fox jumps over the lazy dog After The quick brown fox jumps over the lazy dog The quick brown fox jumps over the lazy dog The quick brown fox jumps over the lazy dog The quick brown fox jumps over the lazy dog The quick brown fox jumps over the lazy dog The quick brown fox jumps oer the lazy dog The quick brown fox jumps over the lazy dog

Note: If the character(s) of the 'other text' immediately preceding the partial insertion match the omitted part of the insertion, then they are indistinguishable from the case where the insertion was longer and are also removed as in the second from last test shown above.


Examine what is said, not who speaks.
"Efficiency is intelligent laziness." -David Dunham
"When I'm working on a problem, I never think about beauty. I think only how to solve the problem. But when I have finished, if the solution is not beautiful, I know it is wrong." -Richard Buckminster Fuller


Replies are listed 'Best First'.
Re^2: more efficient regular expression please (parens)
by tye (Sage) on Jul 03, 2003 at 15:11 UTC

    That also removes cat.msg, vain.msg, etc. Closer to the original intent (as best as I can tell) would be:

    $line =~ s[v?(a?(c?(a?(t?(i?(o?(n?(\.?(m?(­s?g))))))))))][];

                    - tye

      Your right. It does need brackets. I had another go similar in vein to yours, though I bracketed the other way. Both seem to work, with the same caveat that in the partial insertion is preceded by one or more characters that match the missing part, they get removed also, but without some delimeter, this will always be the case.

      Any thought about which bracketing causes the least amount of work?


      Examine what is said, not who speaks.
      "Efficiency is intelligent laziness." -David Dunham
      "When I'm working on a problem, I never think about beauty. I think only how to solve the problem. But when I have finished, if the solution is not beautiful, I know it is wrong." -Richard Buckminster Fuller


Re: Re: more efficient regular expression please
by Not_a_Number (Prior) on Jul 03, 2003 at 15:09 UTC

    oops!

    last two lines of output

    The quick brown fox jumps oer the lazy dog The quick brown fox jumps over the lazy dog

    Where did that 'v' go?


      Your right. It was flawed. Another attempt.

      #! perl -slw use strict; # Set up some test data. my $text = 'The quick brown fox jumps over the lazy dog'; my @tests = map{ my $t = $text; substr($t, rand( length $text ), 0 ) = $_; $t; } map{ substr 'vacation.msg', $_ } 0 ..6; print "Before\n"; print for @tests; # s[(?:(?:(?:(?:(?:(?:v?a)?c)?a)?t)?i)?o)?n.msg][] for @tests; print "\nAfter\n"; print for @tests; __END__ P:\>junk Before The quick brown fox jumps ovvacation.msger the lazy dog The quick brown fox jumps oacation.msgver the lazy dog The quick brocation.msgwn fox jumps over the lazy dog The quick brown fox jumpsation.msg over the lazy dog The quick brown fox jumps over the lation.msgzy dog Tion.msghe quick brown fox jumps over the lazy dog The quick brown fox jumps over the lazy on.msgdog After The quick brown fox jumps over the lazy dog The quick brown fox jumps over the lazy dog The quick brown fox jumps over the lazy dog The quick brown fox jumps over the lazy dog The quick brown fox jumps over the lzy dog The quick brown fox jumps over the lazy dog The quick brown fox jumps over the lazy dog

      This time, the apparent error is explainable.

      Examine what is said, not who speaks.
      "Efficiency is intelligent laziness." -David Dunham
      "When I'm working on a problem, I never think about beauty. I think only how to solve the problem. But when I have finished, if the solution is not beautiful, I know it is wrong." -Richard Buckminster Fuller