diff options
author | Araq <rumpf_a@web.de> | 2018-04-19 00:09:36 +0200 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2018-04-19 00:09:55 +0200 |
commit | 5d13e3f28bf479cd1d59fdec7f34847df988416c (patch) | |
tree | e2a6ca189612a842f87cf25cd8be302de03bb2a6 | |
parent | e237428d424ad18e03d4ffa6d036afb175d28bff (diff) | |
download | Nim-5d13e3f28bf479cd1d59fdec7f34847df988416c.tar.gz |
fixes #7507
-rw-r--r-- | lib/pure/strutils.nim | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/lib/pure/strutils.nim b/lib/pure/strutils.nim index d772b066c..54fdcb4d0 100644 --- a/lib/pure/strutils.nim +++ b/lib/pure/strutils.nim @@ -1647,11 +1647,15 @@ proc replace*(s, sub: string, by = ""): string {.noSideEffect, let last = s.high var i = 0 while true: - var j = find(a, s, sub, i, last) + let j = find(a, s, sub, i, last) if j < 0: break add result, substr(s, i, j - 1) add result, by - i = j + len(sub) + if sub.len == 0: + if i < s.len: add result, s[i] + i = j + 1 + else: + i = j + sub.len # copy the rest: add result, substr(s, i) @@ -1680,6 +1684,7 @@ proc replaceWord*(s, sub: string, by = ""): string {.noSideEffect, initSkipTable(a, sub) var i = 0 let last = s.high + let sublen = max(sub.len, 1) while true: var j = find(a, s, sub, i, last) if j < 0: break @@ -1688,7 +1693,7 @@ proc replaceWord*(s, sub: string, by = ""): string {.noSideEffect, (j+sub.len >= s.len or s[j+sub.len] notin wordChars): add result, substr(s, i, j - 1) add result, by - i = j + len(sub) + i = j + sublen else: add result, substr(s, i, j) i = j + 1 @@ -2546,6 +2551,9 @@ when isMainModule: doAssert "-ld a-ldz -ld".replaceWord("-ld") == " a-ldz " doAssert "-lda-ldz -ld abc".replaceWord("-ld") == "-lda-ldz abc" + doAssert "-lda-ldz -ld abc".replaceWord("") == "lda-ldz ld abc" + doAssert "oo".replace("", "abc") == "abcoabcoabc" + type MyEnum = enum enA, enB, enC, enuD, enE doAssert parseEnum[MyEnum]("enu_D") == enuD |