使用正则表达式拆分复杂的字符串

时间:2009-05-26 14:06:01

标签: javascript regex

如何使用正则表达式拆分此字符串

string = "a[a=d b&c[e[100&2=34]]] e[cheese=blue and white] x[a=a b]"

进入此数组

string.split( regexp ) =>

[ "a[a=d b&c[e[100&2=34]]]", "e[cheese=blue and white]", "x[a=a b]" ]

基本规则是字符串应拆分为空格(\ s),除非括号内存在空格([strong>空格] ]);

4 个答案:

答案 0 :(得分:5)

你不能;正则表达式基于没有“堆栈”的状态机,因此您可以记住嵌套级别的数量。

但也许你可以使用一个技巧:尝试将字符串转换为有效的JSON string。然后,您可以使用eval()将其解析为JavaScript对象。

答案 1 :(得分:4)

如果规则很简单,我建议手动完成。逐步浏览每个字符,并通过每个字符增加1来跟踪您的嵌套级别[并逐渐减少1]。如果你到达一个嵌套== 0的空间然后拆分。

编辑: 我想我也可能会提到在某些语言中还有其他模式匹配工具本身支持这种事情。例如,在Lua中,您可以使用'%b []'来匹配平衡嵌套的[]。 (当然,Lua没有内置的拆分功能......)

答案 2 :(得分:0)

你可以拆分“(?< =])\ s(?= [a-z] [)”?也就是说,一个前面有一个空格,后跟一个字母和一个[?这假设你在括号内没有任何字符串,如“a [b = d [x = y b] g [w = v b]]”

答案 3 :(得分:0)

另一种是循环方法,您可以一次解构一个嵌套括号,否则很难(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