Regex按名称查找函数,其声明可以是任何格式

Regex find function by name whose declaration can be in any format

本文关键字:声明 格式 任何 查找 函数 Regex      更新时间:2023-09-26

我有一个像下面这样的javascript文件(例如只发布了几行)在Gedit(3.10.2及以后)/Geany(1.26及以后)编辑器中打开:

doFilter : function(){
        var filters = $$('#'+this.containerId+' .filter input', '#'+this.containerId+' .filter select');
        var elements = [];
        for(var i in filters){
            if(filters[i].value && filters[i].value.length) elements.push(filters[i]);
        }
        if (!this.doFilterCallback || (this.doFilterCallback && this.doFilterCallback())) {
            this.reload(this.addVarToUrl(this.filterVar, encode_base64(Form.serializeElements(elements))));
        }
    },
resetFilter = function(){
    this.reload(this.addVarToUrl(this.filterVar, ''));
},
checkCheckboxes : function(element){
    elements = Element.select($(this.containerId), 'input[name="'+element.name+'"]');
    for(var i=0; i<elements.length;i++){
        this.setCheckboxChecked(elements[i], element.checked);
    }
},
function openGridRow(grid, event){
    var element = Event.findElement(event, 'tr');
    if(['a', 'input', 'select', 'option'].indexOf(Event.element(event).tagName.toLowerCase())!=-1) {
        return;
    }
    if(element.title){
        setLocation(element.title);
    }
}

在这个文件中,可以看到,javascript函数以各种格式声明,现在我想通过它的名称找到一个函数,我不知道它的声明将是哪种格式。

如何使用正则表达式来实现?

我尝试过function.*{|'w* '= function.*{|jquery.*{,但这给了我所有的函数,我想通过名称找到一个特定的函数,例如doFilter,但我不知道它将以哪种格式声明。

这类正则表达式需要的一件事是按顺序匹配嵌套的大括号——即递归。

但是我不打算写递归匹配,因为我不知道你是否打算在你的JS应用程序中实现这个,或者你只使用你的编辑器搜索功能。

(?:doFilter's*[:=]'s*function|function's*doFilter)'([^)]*')'s*{((?:[^{}]+|{[^}]+})*)}

现场演示

上面的正则表达式不需要一个完整的解释,它很容易阅读,但我将解释可能模棱两可的部分:

{               # Start of function body
  (               # Start of capturing group (1)
    (?:           # Start of non-capturing group (a)
      [^{}]+        # Match characters except { and }
      |             # OR
      {[^}]+}       # Match a block of braces {...}
    )*            # Zero or more times (greedy) - End of non-capturing group (a)
  )               # End of capturing group (1)
}               # End of function body

注意

这个正则表达式应该用于JavaScript代码(特定的函数体),在注释行中没有{},如// { comment (unpaird)或引号字符串string == '{'

如果你需要它们,你可以看看我的答案,并抓住需要的部分

您可能可以做得更好,这还远远没有经过完全测试,但这似乎是有效的:

/(function)?''s*doFilter''s*(:|=)?''s*(function)?''s*''(/

regex 101 test

匹配以下格式:

doFilter : function(){
},
doFilter = function(){
},
function doFilter(grid, event){   
}