mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-06 07:38:24 +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.
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")
|