diff options
-rwxr-xr-x | lib/impure/re.nim | 28 | ||||
-rwxr-xr-x | lib/pure/pegs.nim | 8 | ||||
-rwxr-xr-x | web/news.txt | 2 |
3 files changed, 22 insertions, 16 deletions
diff --git a/lib/impure/re.nim b/lib/impure/re.nim index 11db5cade..1fe1582bd 100755 --- a/lib/impure/re.nim +++ b/lib/impure/re.nim @@ -201,20 +201,20 @@ proc find*(s: string, pattern: TRegEx, start = 0): int = return rawMatches[0] iterator findAll*(s: string, pattern: TRegEx, start = 0): string = - ## yields all matching captures of pattern in `s`. - var matches: array[0..MaxSubpatterns-1, string] - var i = start - while true: - var j = find(s, pattern, matches, i) - if j < 0: break - i = j - for k in 0..maxSubPatterns-1: - if isNil(matches[k]): break - inc(i, matches[k].len) - yield matches[k] + ## yields all matching *substrings* of `s` that match `pattern`. + var i = int32(start) + var rawMatches: array[0..maxSubpatterns * 3 - 1, cint] + while true: + let res = pcre.Exec(pattern.h, pattern.e, s, len(s), i, 0'i32, + cast[ptr cint](addr(rawMatches)), maxSubpatterns * 3) + if res < 0'i32: break + let a = rawMatches[0] + let b = rawMatches[1] + yield substr(s, int(a), int(b)-1) + i = b proc findAll*(s: string, pattern: TRegEx, start = 0): seq[string] = - ## returns all matching captures of pattern in `s`. + ## returns all matching *substrings* of `s` that match `pattern`. ## If it does not match, @[] is returned. accumulateResult(findAll(s, pattern, start)) @@ -450,3 +450,7 @@ when isMainModule: for word in split("00232this02939is39an22example111", re"\d+"): writeln(stdout, word) + for x in findAll("abcdef", re"^{.}", 3): + assert x == "d" + for x in findAll("abcdef", re".", 3): + echo x diff --git a/lib/pure/pegs.nim b/lib/pure/pegs.nim index ed99ef3e8..0a7c95a70 100755 --- a/lib/pure/pegs.nim +++ b/lib/pure/pegs.nim @@ -829,7 +829,7 @@ proc find*(s: string, pattern: TPeg, return -1 iterator findAll*(s: string, pattern: TPeg, start = 0): string = - ## yields all matching captures of pattern in `s`. + ## yields all matching *substrings* of `s` that match `pattern`. var c: TCaptures c.origStart = start var i = start @@ -837,12 +837,12 @@ iterator findAll*(s: string, pattern: TPeg, start = 0): string = c.ml = 0 var L = rawMatch(s, pattern, i, c) if L < 0: break - for k in 0..c.ml-1: yield substr(s, c.matches[k][0], c.matches[k][1]) + yield substr(s, i, i+L-1) inc(i, L) proc findAll*(s: string, pattern: TPeg, start = 0): seq[string] {. nosideEffect, rtl, extern: "npegs$1".} = - ## returns all matching captures of pattern in `s`. + ## returns all matching *substrings* of `s` that match `pattern`. ## If it does not match, @[] is returned. accumulateResult(findAll(s, pattern, start)) @@ -1744,7 +1744,7 @@ when isMainModule: else: assert false - for x in findAll("abcdef", peg"{.}", 3): + for x in findAll("abcdef", peg".", 3): echo x for x in findAll("abcdef", peg"^{.}", 3): diff --git a/web/news.txt b/web/news.txt index cff4bcbec..e047cf1fc 100755 --- a/web/news.txt +++ b/web/news.txt @@ -69,6 +69,8 @@ Changes affecting backwards compatibility type class matching all proc types. Use ``proc ()`` to get the old meaning denoting a proc expecing no arguments and returing no value. - Deprecated ``system.GC_setStrategy``. +- ``re.findAll`` and ``pegs.findAll`` don't return *captures* anymore but + matching *substrings*. Compiler Additions |