使用Regex查找包含特定方法或变量的函数

时间:2013-01-26 20:50:28

标签: regex perl sublimetext2

这是我关于stackoverflow的第一篇文章,所以请温柔地对待我......

我还在学习正则表达式 - 主要是因为我终于发现它们有多么有用,这部分是通过使用Sublime Text 2.所以这是Perl正则表达式(我相信)

我已经在这个和其他网站上搜索过,但我现在真的被卡住了。也许我正在尝试做一些无法做到的事情

我想找到一个正则表达式(模式),它可以让我找到包含给定变量或方法调用的函数或方法或过程等。

我尝试了很多表达式,但他们似乎已经完成了部分工作,但并非一直如此。特别是在Javascript中搜索时,我会选择多个函数声明,而不是最接近我正在寻找的调用/变量的声明。

例如: 我正在寻找调用方法的函数save data() 我从这个优秀的网站上了解到,我可以用(?s)切换。包括换行符

function.*(?=(?s).*?savedata\(\))

然而,这将找到单词function的第一个实例,然后找到所有文本,包括savedata()

如果有多个程序,那么它将从下一个函数开始并重复,直到它再次到达savedata()

function(?s).*?savedata\(\) does something similar

我试过让它忽略第二个功能(我相信),使用类似的东西:

function(?s).*?(?:(?!function).*?)*savedata\(\)

但这不起作用。

我做了一些前瞻性的调查并向后看,但要么我做错了(极有可能),要么他们不是正确的事。

总结(我猜),我如何向后,从给定的单词到最近出现的不同单词。

目前我正在使用它搜索一些javascript文件来尝试理解结构/调用等但最终我希望在c#文件和一些vb.net文件上使用

非常感谢提前

感谢快速回复并抱歉没有添加示例代码块 - 我现在会做(已修改但仍足以显示问题)

如果我有一个简单的javascript块,如下所示:

    function a_CellClickHandler(gridName, cellId, button){
        var stuffhappenshere;
        var and here;
        if(something or other){
            if (anothertest) {

                event.returnValue=false;
                event.cancelBubble=true;
                return true; 
            }
            else{
                event.returnValue=false;
                event.cancelBubble=true;
                return true;
            }
        } 
    }

    function a_DblClickHandler(gridName, cellId){
        var userRow = rowfromsomewhere;
        var userCell = cellfromsomewhereelse;
        //this will need to save the local data before allowing any inserts to ensure that they are inserted in the correct place
        if (checkforarangeofthings){
            if (differenttest) {
                InsSeqNum = insertnumbervalue;
                InsRowID = arow.getValue()
                blnWasInsert = true;
                blnWasDoubleClick = true;
                SaveData();      
            }
        }
    }

对此运行正则表达式 - 包括第二个被识别为应该工作的Sublime Text 2将选择从第一个函数到SaveData()的所有内容

在这种情况下,我希望能够只使用dblClickHandler - 而不是两者。

希望这段代码片段能够增加一些清晰度并抱歉原本不发布,因为我希望标准代码文件就足够了。

1 个答案:

答案 0 :(得分:0)

这个正则表达式将找到包含SaveData方法的每个Javascript函数:

(?<=[\r\n])([\t ]*+)function[^\r\n]*+[\r\n]++(?:(?!\1\})[^\r\n]*+[\r\n]++)*?[^\r\n]*?\bSaveData\(\)

它将匹配函数中的所有行,包括包含SaveData方法的第一行。

<强>警告:

  • 源代码必须具有格式良好的缩进才能使其正常工作,因为正则表达式使用匹配的缩进来检测函数的结尾。
  • 如果函数从文件的第一行开始,则不匹配。

<强>解释

(?<=[\r\n])                      Start at the beginning of a line
([\t ]*+)                        Capture the indentation of that line in Capture Group 1
function[^\r\n]*+[\r\n]++        Match the rest of the declaration line of the function
(?:(?!\1\})[^\r\n]*+[\r\n]++)*?  Match more lines (lazily) which are not the last line of the function, until: 
[^\r\n]*?\bSaveData\(\)          Match the first line of the function containing the SaveData method call

注意: *+++是占有量词,仅用于加速执行。

修改 修复了正则表达式的两个小问题 修改 修复了正则表达式的另一个小问题。