另一种是循环方法,一次只拆分一个级别的嵌套括号,否则很难确保您的单个正则表达式将按预期工作。
下面是红宝石一个例子:
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是解构期间的整数,因此在一些情况下,串中这样原始输入会打破重建。这应该说明方法。
虽然通过遍历字符来完成拆分的代码编写更简单,更安全。
实例红宝石:
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
+1 - 好主意!回到基础,哟! – nickf 2009-05-26 15:02:44