拆分函数属性

时间:2009-11-21 20:31:47

标签: regex actionscript-3 attributes split

您可以使用正则表达式正确分割函数属性吗? 我想要一个表达式,分隔逗号分隔列表中的所有属性。但属性本身可以是数组或对象,也可以包含逗号:

前:

'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中尝试这个 这里有一些代码可以分割所有逗号(这不是我想要的):

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

1 个答案:

答案 0 :(得分:1)

我已经创建了一个小例子如何处理这样的问题,只测试你的输入,所以它可能包含可怕的错误。它只考虑括号而不是(卷曲)括号,但可以很容易地添加。

基本思想是迭代输入中的字符并将它们添加到当前标记(如果它们不是分隔符char),并在遇到分隔符时将当前标记推送到结果数组中。您必须添加一个堆栈,该堆栈将跟踪嵌套的“深度”,以确定逗号是分隔符还是令牌的一部分。

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

正如您所看到的那样快速解析代码变得非常难以理解/调试。在实际情况中,我建议添加更多注释,但也需要一大堆测试来解释您的预期行为。

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;
        }
    }
}