2009-11-21 62 views
0

嗨,才有可能正确地划分功能属性,使用正则表达式? 我想,在分割一个逗号分隔列表中的所有属性的表达。但是属性本身可能是一个数组或对象或东西,也可以包含逗号:划分功能属性

例如:

'string1','string2',sum(1,5,8), ["item1","item2","item3"], "string3" , {a:"text",b:"text2"} 

这应该被分割为:

'string1' 
'string2' 
sum(1,5,8) 
["item1","item2","item3"] 
"string3" 
{a:"text",b:"text2"} 

这样的表达应该分头所有逗号,但不包含由(),{}或[]包围的逗号。

我试图这样在AS3 BTW 这里是一些代码,将拆分所有的逗号(这是ofcourse不是我想要的):

var attr:String = "'string1','string2',sum(1,5,8), ['item1','item2','item3'], 'string3' , {a:'text',b:'text2'}"; 
var result:Array = attr.match(/([^,]+),/g); 
trace(attr); 
for(var a:int=0;a<result.length;a++){ 
    trace(a,result[a]); 
} 

这里是允许嵌套圆括号的表达式,但不是别人......

/([^,]+\([^\)]+\)|[^,]+),*/g 
+0

如果你想允许*嵌套*括号,括号或中括号,那么这相当于解析HTML/XML与正则表达式只是,你正在使用错误的工具。 – 2009-11-21 21:00:09

+0

你是什么意思错误的工具? 我应该使用什么工具? 不正则表达式呢? – Aaike

+0

正则表达式不足以支持嵌套。您需要更强大的代表下推自动机的东西。 – Suppressingfire

回答

1

我创建了一个小例子如何解决这样的问题,只有在你输入的测试,因此它可能包含可怕的错误。它只考虑括号而不考虑(卷曲)大括号,但可以轻松添加。

的基本想法是,你遍历输入的文字,并将其添加到当前的令牌,如果他们不分隔字符,并遇到一个分离器,当按下当前令牌到结果阵列。你必须添加一个堆栈,将跟踪你是如何“深”嵌套来确定一个逗号的是一个令牌的分离或部分。

对于任何比这更复杂的问题,你可能会更好地使用'真正'的解析器(也可能是一个解析器生成器),但在这种情况下,我认为你可以使用一些自定义代码。

正如你可以看到快速解析这样的代码变得相当费解/调试。在实际情况下,我建议添加更多评论,但也是一批很好的测试来解释您的预期行为。

package { 
    import flash.display.Sprite; 

    public class parser extends Sprite 
    { 
     public function parser() 
     { 
      var input:String = "'string1','string2',sum(1,5,8), [\"item1\",\"item2\",\"item3\"], \"string3\" , {a:\"text\",b:\"text2\"}" 


      var result:Array = parseInput(input); 
      for each (var item:String in result) 
      { 
       trace(item); 
      } 
     } 

     // this function only takes into account the '(' and ')' - adding the others is similar. 
     private function parseInput(input:String):Array 
     { 
      var result:Array = []; 
      trace("parsing: " + input); 

      var token:String = ""; 
      var parenthesesStack:Array = []; 
      var currentChar:String; 
      for (var i:int = 0; i < input.length; i++) 
      { 
       currentChar = input.charAt(i) 
       switch (currentChar) 
       { 
        case "(": 
        parenthesesStack.push("("); 
        break; 

        case ")": 
        if (parenthesesStack.pop() != "(") 
        { 
         throw new Error("Parse error at index " + i); 
        } 
        break; 

        case ",": 
        if (parenthesesStack.length == 0) 
        { 
         result.push(token); 
         token = ""; 
        } 
        break; 
       } 
          // add character to the token if it is not a separating comma 
       if (currentChar != "," || parenthesesStack.length != 0) 
       { 
        token = token + currentChar; 
       } 
      } 
      // add the last token 
      if (token != "") 
      { 
       result.push(token); 
      } 

      return result; 
     } 
    } 
} 
+0

很漂亮,我addjusted你编写一个位与各种支架的工作,同时还支持newsted单引号和双引号现在,甜;) 我已经能够解析这个 VAR输入:字符串=“”字符串1,字符串2,字符串2,字符串2,字符串2,字符串2,字符串2,sum(1,5,8),[\“item1 \”,\“item2 \ ,\“item3 \”],\“string3 \”,{a:\“text \”,b:\“text2 \”}“ 这就足够了:) – Aaike