【发布时间】:2012-01-17 10:20:43
【问题描述】:
我想搜索一个文件目录,找出所有调用常用dojo.map 函数及其可选的第四个参数的情况。
我想找到类似的东西
map(an_array, a_function_by_name, x, fourth_arg);
或者也可以使用内联函数:
map(an_array, function(item, i, arr){
//anything
}, x, fourth_arg);
我不想找到没有第四个可选参数的案例。这个函数在代码库中很常见,我必须翻遍数百个误报才能找到案例我真的很想要
//this function also can be called with just 2 or 3 parameters
//(the second parameter can still be inline or not)
map(an_array, a_function);
map(an_array, a_function, x);
我最初考虑使用 grep 处理 map([^,]*,[^,]*,[^,]*,[^,]*) 之类的东西,但我认为这还不够,因为第二个参数是一个函数,这意味着它不仅可以跨越多行,还可以在内部包含任意 Javascript 代码。
当使用所有四个参数调用函数时,找到所有情况的最有效方法是什么?我在 Linux 机器上,不介意为此安装一个小工具恰好是最简单的解决方案。
【问题讨论】:
-
如果您在调用中确实有各种各样的变体,那么除了使用 JavaScript 解析器实际解析文件之外,没有办法做到这一点。因为它当然是 JavaScript,即使是 那个 也会很困难,因为确定你在语法上识别的函数调用是你真正担心的函数调用本身就很困难。
-
@Pointy:我知道这不是微不足道的,这就是为什么我在这里问它:) 但我不确定你是否需要一个完整的 Javascript 解析器,因为我已经知道代码格式正确 - 匹配打开并且右大括号和括号可能足以限制函数和参数
-
也许吧;这取决于您的代码。所需要的只是一个带有不匹配的“(”或“{”字符的带引号的字符串,例如,为了搞砸一些简单的事情。而正则表达式对于处理括号嵌套不是很好。
-
正则表达式无法做到这一点。一旦你有可能使用嵌套的标记对(如 '{' n '}' 或 '(' 和 ')'),正则表达式就不可能了。
-
@FK82:我对这里的任何解决方案都非常满意。如果你愿意,你可以使用骗子 Perl 正则表达式
标签: javascript regex search grep