正则表达式检查字符串是否是一个javascript函数?

时间:2011-04-20 12:21:46

标签: javascript regex

我想检查一个字符串是否是一个有效的javascript函数调用。

有人可以帮我写一个与所有这些匹配的正则表达式:

hello("hello", "world")
greet(1, "mr", "peterson");
run()

但不是这些:

walk()); // invalid syntax
greet(1?23\) // invalid js characters
say("hi" -) // invalid js characters

谢谢!

2 个答案:

答案 0 :(得分:3)

从你的评论中回答隐含的问题:

  

我想在它上面使用eval()。但是我想首先检查它的有效js函数,因为我不想运行变量或无效的字符串。

如果这是使用eval并不是一个坏主意的哦,三个(或更少)有效位置之一,可能最好继续{{1} }并通过eval块处理生成的Error - try/catchEvalError等。有关各种错误的详细信息,请参阅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,那就毫无意义了...... 请注意,我的检查只假设你使用普通变量,没有对象(否则,处理不能在第一个位置的点)