Ignore qualifiers on lookaheads within lookbehinds when checking for a fixed

length.
This commit is contained in:
Philip.Hazel 2018-07-02 11:23:45 +00:00
parent 1c79bdf36f
commit b2294373d7
6 changed files with 66 additions and 0 deletions

View File

@ -100,6 +100,10 @@ a pattern. Because \G is in a lookbehind assertion, there has to be a
"bumpalong" before there can be a match. The automatic "advance by one
character after an empty string match" rule is therefore inappropriate. A more
complicated algorithm has now been implemented.
22. When checking to see if a lookbehind is of fixed length, lookaheads were
correctly ignored, but qualifiers on lookaheads were not being ignored, leading
to an incorrect "lookbehind assertion is not fixed length" error.
Version 10.31 12-February-2018

View File

@ -8572,6 +8572,32 @@ for (;; pptr++)
case META_LOOKAHEADNOT:
pptr = parsed_skip(pptr + 1, PSKIP_KET);
if (pptr == NULL) goto PARSED_SKIP_FAILED;
/* Also ignore any qualifiers that follow a lookahead assertion. */
switch (pptr[1])
{
case META_ASTERISK:
case META_ASTERISK_PLUS:
case META_ASTERISK_QUERY:
case META_PLUS:
case META_PLUS_PLUS:
case META_PLUS_QUERY:
case META_QUERY:
case META_QUERY_PLUS:
case META_QUERY_QUERY:
pptr++;
break;
case META_MINMAX:
case META_MINMAX_PLUS:
case META_MINMAX_QUERY:
pptr += 3;
break;
default:
break;
}
break;
/* Lookbehinds can be ignored, but must themselves be checked. */

10
testdata/testinput1 vendored
View File

@ -6192,4 +6192,14 @@ ef) x/x,mark
/(?<=\G.)/g,aftertext
abc
/(?<=(?=.)?)/
/(?<=(?=.)?+)/
/(?<=(?=.)*)/
/(?<=(?=.){4,5})/
/(?<=(?=.){4,5}x)/
# End of testinput1

2
testdata/testinput2 vendored
View File

@ -5435,4 +5435,6 @@ a)"xI
/(?=a+)a(a+)++b/B
/(?<=(?=.){4,5}x)/B
# End of testinput2

10
testdata/testoutput1 vendored
View File

@ -9831,4 +9831,14 @@ No match
0:
0+
/(?<=(?=.)?)/
/(?<=(?=.)?+)/
/(?<=(?=.)*)/
/(?<=(?=.){4,5})/
/(?<=(?=.){4,5}x)/
# End of testinput1

14
testdata/testoutput2 vendored
View File

@ -16583,6 +16583,20 @@ No match
End
------------------------------------------------------------------
/(?<=(?=.){4,5}x)/B
------------------------------------------------------------------
Bra
AssertB
Reverse
Assert
Any
Ket
x
Ket
Ket
End
------------------------------------------------------------------
# End of testinput2
Error -70: PCRE2_ERROR_BADDATA (unknown error number)
Error -62: bad serialized data