到目前为止我所拥有的内容:\w+\(((".+")|(\d+))+\)
我不确定如何匹配以逗号分隔的多个参数。如何捕获以下测试用例的参数(和函数名称)?
scroll("foo")
scroll("foo",55)
scroll("foo","bar")
scroll("foo","bar",55)
scroll(55)
scroll(55,"foo")
scroll(55, 13,"foo","bar")
例如,在最后一个群组中,群组必须是scroll
,55
,13
,"foo"
和"bar"
。
编辑:语言是AS3
答案 0 :(得分:1)
试试这个冗长的正则表达式:
any
上面的代码设置为最多捕获五个参数。您可以根据需要添加/删除此代码(\"?\w+\"?)\((\"?\w+\"?)(?:[,\s]+(\"?\w+\"?))?(?:[,\s]+(\"?\w+\"?))?(?:[,\s]+(\"?\w+\"?))?\)?
来进行调整。
答案 1 :(得分:1)
我希望我的方式正确 你想拆分例如
这:scroll ( 55, 13, "foo", "bar" )
到它的函数名和参数如
这:scroll
(55
,13
,"foo"
,"bar"
)
表达的更好结果:
我只是假设额外的空格以提高准确性
正则表达式将是:
[^ \ 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")
*/