On Mon, 8 Jul 2019, ND via Pcre-dev wrote:

> And if we disregards Perl's bugs then it seems (*COMMIT) in Perl works in a
> following manner:
> 
> 1. Backtracking can't move to the left of COMMIT (this is PCRE behaviour too)
> 2. If COMMIT occurs then no advance match to any other position of subject can
> happen. No matter there are any other backtracking control verbs occurs after
> COMMIT or COMMIT occurs in atomic group/negative lookaround etc (this is not
> implemented by PCRE)

There is also a difference in the way Perl handles repeated groups. 
Consider

Perl 5.030000 Regular Expressions
/\A(?:.(*COMMIT))*c/
    abcd
 0: abc

PCRE2 version 10.34-RC1 2019-04-22
/\A(?:.(*COMMIT))*c/
    abcd
No match

In Perl, the group repeat matches "abcd", but when it then does not
match "c", it unwinds complete repetitions of the group. In PCRE2,
there is a backtrack onto *COMMIT, so it fails. Looks like Perl handles 
*COMMIT somehow differently to normal backtracks, because it does do 
ordinary backtracks into repeated groups:

Perl 5.030000 Regular Expressions
/\A(.{1,2})*X/
    AABBCX
 0: AABBCX
 1: C

Adding {1,2} to the first example gives this:

Perl 5.030000 Regular Expressions
/\A(?:.{1,2}(*COMMIT))*c/
    abcd
No match

Having another backtrack point inside the group changes things, but then
I found this:

Perl 5.030000 Regular Expressions
/\A(?:(*COMMIT).)*c/
    abcd
No match

I give up!

Philip

-- 
Philip Hazel

-- 
## List details at https://lists.exim.org/mailman/listinfo/pcre-dev 

Reply via email to