in reply to Re^2: Integrating match counts into regex matching
in thread Integrating match counts into regex matching

  1. What does (?<!a) do?

    Zero-length negative lookbehind. Ensures that the string of a's is not preceded by another a.

  2. What does (?!b) do?

    Zero-length negative lookahead. Ensures the matched string of b's is not followed by another b.


Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
"Too many [] have been sedated by an oppressive environment of political correctness and risk aversion."

Replies are listed 'Best First'.
Re^4: Integrating match counts into regex matching
by ikegami (Patriarch) on Dec 19, 2008 at 08:21 UTC
    Why? I can't think of a situation where omitting the lookahead and the lookbehind will change the answer.

    Nevermind, I didn't realize this was a new thread with a different question.

      I'm not sure that it is a different question? Anyhow, my limited testing threw up one case where the negative lookbehind was necessary:

      With and without negative lookbehind:

      Perl> 'aaabb' =~ m[ (?{ local( $a, $b ) }) ( (?<!a) ( a (?{++$a}) )+ ( b (?{++$b}) )+ ) (?(?{ $a+1 == $b }) (?=) | (?!) ) ]x and print "'$1'";; Perl> 'aaabb' =~ m[ (?{ local( $a, $b ) }) ( ( a (?{++$a}) )+ ( b (?{++$b}) )+ ) (?(?{ $a+1 == $b }) (?=) | (?!) ) ]x and print "'$1'";; 'abb'

      A breif further test suggests that the negative lookahead may be unnecessary, but I threw it in on the basis that it would do no harm, and may catch a case I haven't thought to test. With a regex using closures, it's doubtful if it will slow things down noticably?


      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.