我正在尝试编写一个正则表达式来匹配构造函数字符串中的所有JavaScript方法定义。
//These two should match
this.myMethod_1 = function(test){ return "foo" }; //Standard
this.myMethod_2 = function(test, test2){ return "foo" }; //Spaces before
//All of these should not
//this.myMethod_3 = function(test){ return "foo" }; //Comment shouldn't match
/**
*this.myMethod_4 = function(test){ return "foo" }; //Block comment shouldn't match
*/
// this.myMethod_5 = function(test){ return "foo" }; //Comment them spaces shouldn't match
/*
* this.myMethod_6 = function(test){ return "foo" }; //Block comment + spaces shouldn't match
*/
this.closure = (function(){ alert("test") })(); //closures shouldn't match
正则表达式应匹配['myMethod_1','myMethod_2']。正则表达式不应与['myMethod_3','myMethod_5','myMethod_6','closure']匹配。
这是我到目前为止所做的,但我对评论中出现的问题感到疑惑:
/(?<=this\.)\w*(?=\s*=\s*function\()/g
我一直在用这个很酷的site来测试它。
我该如何解决这个问题?
答案 0 :(得分:5)
这听起来很复杂。你需要为此创建一个解析器,一个简单的正则表达式很可能不会成功。
A very good starting point is Narcissus,这是一个用JavaScript编写的JavaScript解析器。
这只是1000行代码。应该可以只提取它的方法匹配部分。
答案 1 :(得分:0)
在开头添加^\s*
可能会有所帮助。它并不完美,但它适用于您的测试用例。
答案 2 :(得分:0)
一个正则表达式可能难以编写和调试。考虑编写几个正则表达式,每个正则表达式应该匹配以确认或拒绝一段代码。
例如,
/(?<=this.)\w*(?=\s*=\s*function()/g // Matches a simple constructor.
/^\/\// // If it matches then this line starts with a comment.
等等。