匹配函数与Regex的参数

时间:2016-11-23 16:40:04

标签: regex actionscript-3

到目前为止我所拥有的内容:\w+\(((".+")|(\d+))+\)我不确定如何匹配以逗号分隔的多个参数。如何捕获以下测试用例的参数(和函数名称)?

scroll("foo")
scroll("foo",55)
scroll("foo","bar")
scroll("foo","bar",55)
scroll(55)
scroll(55,"foo")
scroll(55, 13,"foo","bar")

例如,在最后一个群组中,群组必须是scroll5513"foo""bar"

编辑:语言是AS3

3 个答案:

答案 0 :(得分:1)

试试这个冗长的正则表达式:

any

上面的代码设置为最多捕获五个参数。您可以根据需要添加/删除此代码(\"?\w+\"?)\((\"?\w+\"?)(?:[,\s]+(\"?\w+\"?))?(?:[,\s]+(\"?\w+\"?))?(?:[,\s]+(\"?\w+\"?))?\)? 来进行调整。

演示:https://regex101.com/r/o1RRSG/1

答案 1 :(得分:1)

我希望我的方式正确 你想拆分例如

这:scroll ( 55, 13, "foo", "bar" )

到它的函数名和参数如

这:scroll5513"foo""bar"

  

表达的更好结果:

     

enter image description here

我只是假设额外的空格以提高准确性

正则表达式将是:

  

[^ \ t(,)]

答案 2 :(得分:1)

好吧,你可能不喜欢它,但只要你有ExternalInterface支持JS可用,它就是完美。这很有趣。 (使用reg exps执行此操作与乐趣相反。)

这个想法是让JS做它的eval。手册说你必须将函数名称传递给ExternalInterface.call(),这不是真的:只传递任何评估为函数引用的代码。这样您就可以将任何JS代码注入SWF所在的页面(这就是为什么AllowScriptAccess是一个非常危险的属性)。

public class Test extends Sprite
{
    public function Test()
    {
        var test = "scroll(55, 13,\"foo\",\"bar\", \"now(), we are \\\"screwed\\\")\")";
        trace(test);
        var details = parseFunctionCall(test);
        trace(details[0]);
        for (var i = 1; i<details.length; i++) {
            trace("\t"+i+": "+typeof(details[i])+" "+details[i]);
        }
    }

    private function parseFunctionCall(input:String):Array
    {
        if (ExternalInterface.available) {
            var split:RegExp = /^(\w+)\((.+)\)$/;
            var info = split.exec(input);
            var inject = "(function(){return ["+info[2]+"];})";
            var params = ExternalInterface.call(inject);
            params.unshift(info[1]);
            return params;
        }
        return null;
    }
}

/*
Output:

scroll
    1: number 55
    2: number 13
    3: string foo
    4: string bar
    5: string now(), we are "screwed")
*/