Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@ backtracking after the recursive call.
3. (#1040) Fixed the start_match field passed to interpreter callouts after \K
resets the start of a match, including restoration on backtracking.

4. Fixed \X so that an extended grapheme cluster continues after a regional
indicator when extending characters, spacing marks or ZWJ follow (GB9 and GB9a
in UAX #29), and after a prepend character when an Extended_Pictographic
character follows (GB9b). Previously \X ended the cluster in both places.


Version 10.49 28-September-2026
-------------------------------
Expand Down
4 changes: 2 additions & 2 deletions src/pcre2_tables.c
Original file line number Diff line number Diff line change
Expand Up @@ -207,15 +207,15 @@ const uint32_t PRIV(ucp_gbtable)[] = {
ESZ|(1u<<ucp_gbPrepend)| /* 4 Prepend */
(1u<<ucp_gbL)|(1u<<ucp_gbV)|(1u<<ucp_gbT)|
(1u<<ucp_gbLV)|(1u<<ucp_gbLVT)|(1u<<ucp_gbOther)|
(1u<<ucp_gbRegional_Indicator),
(1u<<ucp_gbRegional_Indicator)|(1u<<ucp_gbExtended_Pictographic),
ESZ, /* 5 SpacingMark */
ESZ|(1u<<ucp_gbL)|(1u<<ucp_gbV)|(1u<<ucp_gbLV)| /* 6 L */
(1u<<ucp_gbLVT),
ESZ|(1u<<ucp_gbV)|(1u<<ucp_gbT), /* 7 V */
ESZ|(1u<<ucp_gbT), /* 8 T */
ESZ|(1u<<ucp_gbV)|(1u<<ucp_gbT), /* 9 LV */
ESZ|(1u<<ucp_gbT), /* 10 LVT */
(1u<<ucp_gbRegional_Indicator), /* 11 Regional Indicator */
ESZ|(1u<<ucp_gbRegional_Indicator), /* 11 Regional Indicator */
ESZ, /* 12 Other */
ESZ|(1u<<ucp_gbExtended_Pictographic), /* 13 ZWJ */
ESZ, /* 14 Extended Pictographic */
Expand Down
9 changes: 8 additions & 1 deletion testdata/testinput4
Original file line number Diff line number Diff line change
Expand Up @@ -1632,7 +1632,14 @@
\x{1F1E6}\x{1F1E7}\x{1F1E8}\x{1F1E9}B RegionalIndicator RegionalIndicator RegionalIndicator RegionalIndicator
\x{200d}\x{1f308}B ZWJ without Extended_Pictographic
\x{261d}\x{200d}\x{1f308}B Extended_Pictographic ZWJ Extended_Pictographic
*There are no Prepend characters, so we can't test Prepend, CR
*Test regional indicators followed by extend, spacing mark and ZWJ
\x{1F1E6}\x{300}B RegionalIndicator Extend
\x{1F1E6}\x{903}B RegionalIndicator SpacingMark
\x{1F1E6}\x{1F1E7}\x{200d}\x{1F1E8}B RegionalIndicator RegionalIndicator ZWJ RegionalIndicator
*Test Prepend
\x{6dd}\x{a9}B Prepend Extended_Pictographic
\x{600}AB Prepend Other
\x{600}\x{0d}B Prepend CR

/^.\X/utf,aftertext
A\x{1F1E6}\x{1F1E7}\x{1F1E8}B
Expand Down
9 changes: 8 additions & 1 deletion testdata/testinput7
Original file line number Diff line number Diff line change
Expand Up @@ -1739,7 +1739,14 @@
\x0a\x{1b04}LF, spacingmark
\x0b\x{0711}Control, extend
\x09\x{1b04}Control, spacingmark
\= There are no Prepend characters, so we can't test Prepend, CR
\= Test regional indicators followed by extend, spacing mark and ZWJ
\x{1F1E6}\x{300}B RegionalIndicator Extend
\x{1F1E6}\x{903}B RegionalIndicator SpacingMark
\x{1F1E6}\x{1F1E7}\x{200d}\x{1F1E8}B RegionalIndicator RegionalIndicator ZWJ RegionalIndicator
\= Test Prepend
\x{6dd}\x{a9}B Prepend Extended_Pictographic
\x{600}AB Prepend Other
\x{600}\x{0d}B Prepend CR

/^(?>\X{2})X/utf,aftertext
\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
Expand Down
25 changes: 23 additions & 2 deletions testdata/testoutput4
Original file line number Diff line number Diff line change
Expand Up @@ -2733,9 +2733,30 @@ No match
\x{261d}\x{200d}\x{1f308}B Extended_Pictographic ZWJ Extended_Pictographic
0: \x{261d}\x{200d}\x{1f308}
0+ B Extended_Pictographic ZWJ Extended_Pictographic
*There are no Prepend characters, so we can't test Prepend, CR
*Test regional indicators followed by extend, spacing mark and ZWJ
0: *
0+ There are no Prepend characters, so we can't test Prepend, CR
0+ Test regional indicators followed by extend, spacing mark and ZWJ
\x{1F1E6}\x{300}B RegionalIndicator Extend
0: \x{1f1e6}\x{300}
0+ B RegionalIndicator Extend
\x{1F1E6}\x{903}B RegionalIndicator SpacingMark
0: \x{1f1e6}\x{903}
0+ B RegionalIndicator SpacingMark
\x{1F1E6}\x{1F1E7}\x{200d}\x{1F1E8}B RegionalIndicator RegionalIndicator ZWJ RegionalIndicator
0: \x{1f1e6}\x{1f1e7}\x{200d}
0+ \x{1f1e8}B RegionalIndicator RegionalIndicator ZWJ RegionalIndicator
*Test Prepend
0: *
0+ Test Prepend
\x{6dd}\x{a9}B Prepend Extended_Pictographic
0: \x{6dd}\x{a9}
0+ B Prepend Extended_Pictographic
\x{600}AB Prepend Other
0: \x{600}A
0+ B Prepend Other
\x{600}\x{0d}B Prepend CR
0: \x{600}
0+ \x{0d}B Prepend CR

/^.\X/utf,aftertext
A\x{1F1E6}\x{1F1E7}\x{1F1E8}B
Expand Down
21 changes: 20 additions & 1 deletion testdata/testoutput7
Original file line number Diff line number Diff line change
Expand Up @@ -3036,7 +3036,26 @@ Partial match: AA
\x09\x{1b04}Control, spacingmark
0: \x{09}
0+ \x{1b04}Control, spacingmark
\= There are no Prepend characters, so we can't test Prepend, CR
\= Test regional indicators followed by extend, spacing mark and ZWJ
\x{1F1E6}\x{300}B RegionalIndicator Extend
0: \x{1f1e6}\x{300}
0+ B RegionalIndicator Extend
\x{1F1E6}\x{903}B RegionalIndicator SpacingMark
0: \x{1f1e6}\x{903}
0+ B RegionalIndicator SpacingMark
\x{1F1E6}\x{1F1E7}\x{200d}\x{1F1E8}B RegionalIndicator RegionalIndicator ZWJ RegionalIndicator
0: \x{1f1e6}\x{1f1e7}\x{200d}
0+ \x{1f1e8}B RegionalIndicator RegionalIndicator ZWJ RegionalIndicator
\= Test Prepend
\x{6dd}\x{a9}B Prepend Extended_Pictographic
0: \x{6dd}\x{a9}
0+ B Prepend Extended_Pictographic
\x{600}AB Prepend Other
0: \x{600}A
0+ B Prepend Other
\x{600}\x{0d}B Prepend CR
0: \x{600}
0+ \x{0d}B Prepend CR

/^(?>\X{2})X/utf,aftertext
\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
Expand Down