首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拆分函数属性

问拆分函数属性
EN

Stack Overflow用户
提问于 2009-11-22 04:31:47
回答 1查看 142关注 0票数 0

可以使用正则表达式正确地拆分函数属性吗?我想要一个表达式,它将所有属性分割成逗号分隔的列表。但属性本身可以是Array或Object,或者还可以包含逗号的内容:

例如:

代码语言:javascript
复制
'string1','string2',sum(1,5,8), ["item1","item2","item3"], "string3" , {a:"text",b:"text2"}

这应该被拆分为:

代码语言:javascript
复制
'string1'
'string2'
sum(1,5,8)
["item1","item2","item3"]
"string3"
{a:"text",b:"text2"}

因此,表达式应该分割所有逗号,但不能分割()、{}或[]所包围的逗号。

我在as3中尝试这样做,顺便说一下,这是一些可以拆分所有逗号的代码(这当然不是我想要的):

代码语言:javascript
复制
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]);
}

这是一个允许嵌套圆括号的表达式,但不允许其他表达式...

代码语言:javascript
复制
/([^,]+\([^\)]+\)|[^,]+),*/g
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-11-22 06:33:56

我已经创建了一个小例子来解决这样的问题,只是在你的输入上进行了测试,所以它可能包含可怕的错误。它只考虑圆括号,而不考虑(花括号),但这些可以很容易地添加。

基本思想是遍历输入中的字符,如果它们不是分隔符字符,则将它们添加到当前标记中,并在遇到分隔符时将当前标记推入结果数组。你必须添加一个堆栈来跟踪你的嵌套深度,以确定逗号是分隔符还是标记的一部分。

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

正如您所看到的,像这样解析代码很快就会变得非常难以理解和调试。在真实的场景中,我建议添加更多的注释,但也要添加一批很好的测试来解释您的预期行为。

代码语言:javascript
复制
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;
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1776683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档