我想检查一个字符串是否是一个有效的javascript函数调用。
有人可以帮我写一个与所有这些匹配的正则表达式:
hello("hello", "world")
greet(1, "mr", "peterson");
run()
但不是这些:
walk()); // invalid syntax
greet(1?23\) // invalid js characters
say("hi" -) // invalid js characters
谢谢!
答案 0 :(得分:3)
从你的评论中回答隐含的问题:
我想在它上面使用eval()。但是我想首先检查它的有效js函数,因为我不想运行变量或无效的字符串。
如果这是使用eval
并不是一个坏主意的哦,三个(或更少)有效位置之一,可能最好继续{{1} }并通过eval
块处理生成的Error
- try/catch
,EvalError
等。有关各种错误的详细信息,请参阅the spec - 如果您关心错误是什么;大多数情况下,我认为你只是想知道是否存在问题,例如:
SyntaxError
但是:您可以(而且应该)几乎总是避免使用try {
eval(theString);
}
catch (e) {
// Something went wrong, report it
}
。例如,如果你想允许某人给你一些可能需要参数的东西(你的eval
),只要让他们给你一个你没有参数调用的函数,他们就会给你一个包装器,例如:< / p>
hello("hello", "world")
答案 1 :(得分:2)
您可以为参数定义folloding regexp,意思是字符串或整数或浮点数或变量
string literal : "[^"]"
int : -?\d+
float : -?\d*\.\d+
variable / function name : [\w\d_]+
parameter : ("[^"]"|-?\d+|-?\d*\.\d+|[\w\d_]+)
然后你的函数与变量相同,后跟括号几个参数,然后是右括号。
rough : function \( (|parameter(,parameter)*\)
adding potential spaces : function\s*\(\s*(|parameter\s$(,\s*parameter\s*)*\)
replacing blocks : [\w\d_]+\s*\(\s*(|("[^"]"|-?\d+|-?\d*\.\d+|[\w\d_]+)\s$(,\s*("[^"]"|-?\d+|-?\d*\.\d+|[\w\d_]+)\s*)*\)
请注意,您需要匹配多行和不区分大小写。我不确定它是否有错误,但至少你可以按照你必须处理的那种思维来调整它。
编辑:我认为它相当复杂(我可能会遇到一些情况),但是在你的评论之后,如果它只是为了运行eval,那就毫无意义了...... 请注意,我的检查只假设你使用普通变量,没有对象(否则,处理不能在第一个位置的点)