- Offizieller Beitrag
Kann man immer brauchen, Paare (auch verschachtelt) mit den Begrenzern "< > [ ] { } ( )" lassen sich so sauber auslesen. Es wird nur das öffnende Zeichen übergeben:
Code
proc balancedPairs(s: string, a: char): seq[string] =
proc openPos(s: string, a: char): seq[int] =
var seqOpenpos = newSeq[int]()
for i in 0..s.len - 1:
if s[i] == a: seqOpenpos.add(i)
result = seqOpenpos
proc boundSearch(s: string, a, b: char, n: int): string =
var
iopen: int
level = 0
for i in n..s.len - 1:
if s[i] == a:
if level == 0: iopen = i
level += 1
elif s[i] == b:
level -= 1
if level == 0:
return s[iopen..i]
result = ""
var
seqBalanced = newSeq[string]()
aPairs = ['(', '{', '[', '<', ')', '}', ']', '>']
b = ' '
sop: seq[int]
# get the counterpart char
for i in 0..3:
if aPairs[i] == a: b = aPairs[i + 4]
if b != ' ':
sop = s.openPos(a)
for i in sop: seqBalanced.add(s.boundSearch(a, b, i))
result = seqBalanced
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
let sNested = "(1st bound (nested #1 (nested #2)) 1st (neighbour nested #1) 1st)"
let bp = sNested.balancedPairs('(')
echo bp
# result: @["(1st bound (nested #1 (nested #2)) 1st (neighbour nested #1) 1st)", "(nested #1 (nested #2))", "(nested #2)", "(neighbour nested #1)"]
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Alles anzeigen