mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-13 19:15:51 +00:00
1. A trailing `$` at the end of a replacement string could read out of
bounds via `how[i + 1]`; this now raises `ValueError` instead.
2. Numeric capture parsing used `id += (id * 10) + digit` instead of `id
= (id * 10) + digit`, so multi-digit refs were parsed incorrectly (e.g.
`$12` resolved as capture 13 instead of 12).
4. Unterminated named replacement syntax (e.g. `${foo)` is now rejected
with ValueError instead of being accepted and parsed inconsistently.
Found and fixed by GPT 5.3 Codex.
(cherry picked from commit 9b2b286baf)
29 lines
1.3 KiB
Nim
29 lines
1.3 KiB
Nim
include nre
|
|
import unittest
|
|
|
|
block: # replace
|
|
block: # replace with 0-length strings
|
|
check("".replace(re"1", proc (v: RegexMatch): string = "1") == "")
|
|
check(" ".replace(re"", proc (v: RegexMatch): string = "1") == "1 1")
|
|
check("".replace(re"", proc (v: RegexMatch): string = "1") == "1")
|
|
|
|
block: # regular replace
|
|
check("123".replace(re"\d", "foo") == "foofoofoo")
|
|
check("123".replace(re"(\d)", "$1$1") == "112233")
|
|
check("123".replace(re"(\d)(\d)", "$1$2") == "123")
|
|
check("123".replace(re"(\d)(\d)", "$#$#") == "123")
|
|
check("123".replace(re"(?<foo>\d)(\d)", "$foo$#$#") == "1123")
|
|
check("123".replace(re"(?<foo>\d)(\d)", "${foo}$#$#") == "1123")
|
|
check("abcdefghijklm".replace(re"(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)(m)", "$12") == "l")
|
|
|
|
block: # replacing missing captures should throw instead of segfaulting
|
|
expect IndexDefect: discard "ab".replace(re"(a)|(b)", "$1$2")
|
|
expect IndexDefect: discard "b".replace(re"(a)?(b)", "$1$2")
|
|
expect KeyError: discard "b".replace(re"(a)?", "${foo}")
|
|
expect KeyError: discard "b".replace(re"(?<foo>a)?", "${foo}")
|
|
|
|
block: # malformed replacement syntax should throw instead of OOB crash
|
|
expect ValueError: discard "a".replace(re"a", "$")
|
|
expect ValueError: discard "a".replace(re"a", "x$")
|
|
expect ValueError: discard "a".replace(re"a", "${foo")
|