Другим является циклический подход, при котором вы разбираете вложенные скобки по одному уровню за раз, иначе трудно (TM) обеспечить, чтобы ваше регулярное выражение работало должным образом.
Вот пример в ruby:
str = "a[a=d b&c[e[100&2=34]]] e[cheese=blue and white] x[a=a b]"
left = str.dup
tokn=0
toks=[]
# Deconstruct
loop do
left.sub!(/\[[^\]\[]*\]/,"\{#{tokn}\}")
break if $~.nil?
toks[tokn]=$&
tokn+=1
end
left=left.split(/\s+/)
# Reconstruct
(toks.size-1).downto(0) do |tokn|
left.each { |str| str.sub!("\{#{tokn}\}", toks[tokn]) }
end
Выше используется {n}, где n - целое число во время деконструкции, поэтому в некоторых случаях исходный ввод, такой как этот, в строке может нарушить реконструкцию. Это должно проиллюстрировать подход.
Написание кода, который выполняет разбиение путем итерации по символам, проще и безопаснее.
Пример в ruby:
str = "a[a=d b&c[e[100&2=34]]] e[cheese=blue and white] x[a=a b]"
toks=[]
level=st=en=0;
str.each_byte do |c|
en+=1;
level+=1 if c=='['[0];
level-=1 if c==']'[0];
if level==0 && c==' '[0]
toks.push(str[st,en-1-st]);
st=en
end
end
toks.push(str[st,en-st]) if st!=en
p toks