Regexp::Keep - filter to allow the C<\K> escape in regexes


Regexp-Keep documentation  | view source Contained in the Regexp-Keep distribution.

Index


NAME

Top

Regexp::Keep - filter to allow the \K escape in regexes

SYNOPSIS

Top

  use Regexp::Keep;

  # slow and inefficient
  my $r = "abc.def.ghi.jkl";
  $r =~ s/(.*)\..*/$1/;

  # fast and efficient
  my $s = "abc.def.ghi.jkl";
  $s =~ s/.*\K\..*//;

DESCRIPTION

Top

This allows you to use the \K escape in your regexes, which fools the regex engine into thinking it has only just started matching your regex. This means you can turn the inefficient replace-with-itself construct

  s/(save)delete/$1/;

into the more efficient

  s/save\Kdelete//;

construct.

IMPLEMENTATION

Top

What \K filters into is .{0}(?{ Regexp::Keep::KEEP }), which is an XS function call embedded into the regex. The function sets PL_regstartp[0] to the current location in the string. This means that $& now starts where \K is seen. That means a replacement will begin being replaced there.

EXAMPLES

Top

Here's are short examples to show you the abilities of \K:

  "alphabet" =~ /([^aeiou][a-z][aeiou])[a-z]/;
  # $1 is "pha", $& is "phab"

  "alphabet" =~ /\K([^aeiou][a-z][aeiou])[a-z]/;
  # $1 is "pha", $& is "phab"

  "alphabet" =~ /([^aeiou]\K[a-z][aeiou])[a-z]/;
  # $1 is "pha", $& is "hab"

  "alphabet" =~ /([^aeiou][a-z]\K[aeiou])[a-z]/;
  # $1 is "pha", $& is "ab"

  "alphabet" =~ /([^aeiou][a-z][aeiou])\K[a-z]/;
  # $1 is "pha", $& is "b"

  "alphabet" =~ /([^aeiou][a-z][aeiou])[a-z]\K/;
  # $1 is "pha", $& is ""

BUGS

Top

I fixed a bug where \K following a simple thing (like a letter that isn't followed by a quantifier) didn't work properly.

If you're using this module, you don't have a version of Perl with the \K escape built-in. Bummer. I should try to make it built-in.

HISTORY

Top

0.02

Fixed /a\Kb/ to become /a.{0}\Kb/, which makes a nasty bug disappear.

0.01

Original release.

AUTHOR

Top

Jeff japhy Pinyan, japhy@pobox.com

COPYRIGHT AND LICENSE

Top


Regexp-Keep documentation  | view source Contained in the Regexp-Keep distribution.