2011-04-20 82 views
2

我想检查一个字符串是否是一个有效的javascript函数调用。正则表达式来检查一个字符串是否是一个JavaScript函数?

可能有人帮我写匹配所有这些,一个正则表达式:

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

但不是这些:

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

谢谢!

+0

我怀疑这是可能的 - 即使它可能非常非常复杂。你可以使用(部分)JavaScript解析器,但也是非常大的。你能解释一下你的整体问题是什么吗?你为什么需要这样做? – RoToRa 2011-04-20 12:26:01

+0

我想使用eval()。但我想首先检查其有效的js函数,因为我不想运行变量或无效字符串。 – ajsie 2011-04-20 12:28:17

+0

请勿使用eval。 – Gareth 2011-04-20 12:29:37

回答

3

从您的评论回答的隐含问题:

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

如果这是一个,哦,三个(或更少)的有效的地方使用eval是不是一个坏主意,可能是更好的通过try/catch继续前进,eval它和处理所产生的Error块  — EvalError,SyntaxError等。有关各种错误的详细信息,请参见the spec   —如果您关心错误是什么;主要是我还以为你只是想知道是否有问题或不,例如:

try { 
    eval(theString); 
} 
catch (e) { 
    // Something went wrong, report it 
} 

:您可以(也应该)几乎总是避免使用eval。例如,如果你想让别人给你一些可能需要参数的东西(你的hello("hello", "world")),就让他们给你一个没有参数的函数,然后他们会给你一个包装,例如:

callTheFunction(function() { 
    hello("hello", "world"); 
}); 
2

您可以定义folloding正则表达式的参数,这意味着字符串或整数或浮点数或可变

string literal : "[^"]" 
int : -?\d+ 
float : -?\d*\.\d+ 
variable/function name : [\w\d_]+ 

parameter : ("[^"]"|-?\d+|-?\d*\.\d+|[\w\d_]+) 

那么你的功能是一样的一个变量,然后括号几个parmeters,然后右括号。

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*)*\) 

请注意,您需要匹配多行和不区分大小写。我不确定它是否具有防错功能,但至少您可以按照您需要处理的这种想法进行微调。

编辑:我认为这是相当复杂的(我可能issed某些情况下),但您的评论后,如果它只是运行的eval,这是毫无意义...... 注意,我只检查假设你使用纯变量,没有对象(否则,应对其不能在第一位置处的点)

+0

我问过于复杂的perl-like-make-your--ex-ble解决方案的标题:-) – Bruce 2011-04-20 12:37:30

+0

Charlie Foxtrot,也许? – Keng 2011-04-21 13:09:58

相关问题