| Ticket UUID: | 884d0ac78cbab248d054ec96d13c2a741bb0a94c | ||
| Title: | Unexpected string-start constraint match in middle of string after newline | ||
| Type: | Bug | Created on: | 2017-12-28 00:52:02 |
| Submitter: | dkf | Assigned to: | jan.nijtmans |
| Subsystem: | 43. Regexp | Severity: | Minor |
| Priority: | 5 Medium | Last modified: | 2026-10-11 20:06:59 |
| Status: | Closed | Closed by: | jan.nijtmans |
| Resolution: | Duplicate | Closed on: | 2026-10-11 20:06:59 |
| Version: | core-8-6-branch tip, 28-Dec-2017 | ||
| Description: | ||||
|
If you do:
regexp -all {^|\n} "foo\nbar"
then it returns 3. I'd expect that (perhaps) with the -line option, but in standard mode that is rather "surprising" as there is only one place where the string starts and only one newline character.
| ||||
| User Comments: | ||||
dkf added on 2017-12-28 12:47:54:
A consequence of this issue is this: % puts [regsub -all "^|\n" "foo\nbar" "\nXX"] XXfoo XX XXbarThe double substitution of \nXX before bar is again "unexpected". tgl added on 2021-02-20 21:37:20:
FWIW, I can't reproduce this misbehavior in current Postgres: I get a correct-looking result from
# select regexp_replace(E'foo\nbar', '^|\n', E'\nXX', 'g');
regexp_replace
----------------
+
XXfoo +
XXbar
(1 row)
I speculate that it got fixed as a side-effect of the constraint loop fixes we did awhile ago.
I thought you guys had absorbed those, though.
serhiy.storchaka added on 2026-10-10 17:51:51:
Same cause as [471101ffff]: with -all, each match was searched in the substring after the previous one, and ^ was allowed there whenever the previous character was a newline, even without -lineanchor. PostgreSQL, whose regex engine is derived from Tcl's, avoids this by passing the whole string with a search start offset. Proposed fix in branch regexp-all-search-start, which does the same: regexp -all {^|\n} "foo\nbar" would return 2, and the regsub example would give a single XX before bar. With -lineanchor, ^ still matches after a newline. Tests regexp-29.4 to 29.7. jan.nijtmans added on 2026-10-11 20:06:59:
Dup of [471101ffff] | ||||
