代码之家  ›  专栏  ›  技术社区  ›  Dennis

Regex:递归搜索内容并返回结果

  •  1
  • Dennis  · 技术社区  · 12 年前

    我有几个调用某个函数的JavaScript源文件。

    function foo( param ) {
       findMe( 'foo' );
       findMe('bar');
    }
    
    function bar() {
       findMe("baz"); dontFindMe(); findMe( "blah"  );
    }
    
    findMe("foobar");
    

    我想在文件中搜索对此函数的调用,并返回传递的参数。这可能看起来不太有用,但相信我——事实上,我只是简化了示例:)

    结果应该是这样的:

    foo
    bar
    baz
    blah
    foobar
    

    这是我目前所得到的:

    13:46:39 ~ > grep -o findMe\([[:space:]]*[\'\"].*[\'\"][[:space:]]*\) ~/Desktop/greptest.txt 
    findMe( 'foo' )
    findMe('bar')
    findMe("baz"); dontFindMe(); findMe( "blah"  )
    findMe("foobar")
    

    但现在,我已经没有什么想法了。有人能告诉我正确的方向吗?我使用grep(BSD-grep)2.5.1-FreeBSD运行Mavericks。

    提前感谢!

    //编辑

    感谢瓦西里提供正确的正则表达式,感谢阿披什凯克将我指向sed。这是我的解决方案:

    14:51:21 ~ > grep -o -E "findMe\(\s*('|\")([^)]+)\1\s*\)" Desktop/greptest.txt | sed "s/findMe([[:space:]]*[\"']\([a-z]*\)[\"'][[:space:]]*)/\1/g"
    
    foo
    bar
    baz
    blah
    foobar
    

    就像一个魅力,谢谢!

    2 回复  |  直到 12 年前
        1
  •  0
  •   Vasili Syrakis    12 年前

    正则表达式

    findMe\(\s*('|")([^)]+)\1\s*\)
    

    解释

    • \( :左括号。
    • \s*('|") :匹配空格(或无),后跟引号(单引号或双引号),并使用组1对其进行反向引用。
    • ([^)]+) :匹配不是右括号的任何内容,并向后引用第2组 (这是您要放入数组中的内容。)
    • \1\s* :匹配第一个捕获组,因此我们有一致的引号。后跟空格(或空白)
    • \) :右括号。

    在线示例:

    Regex101

    为什么要使用此正则表达式

    • 使用backreferences意味着您将匹配位于一致引号内的参数,例如:您将不匹配: findMe('foo") 因为引号不同。

    • 匹配不是右括号的所有内容 ([^)]+) 确保正则表达式不会超出参数并扩展到另一个函数参数中,例如,您将不会匹配以下内容: findMe('foo) accident ')

        2
  •  0
  •   Abhishek Bansal    12 年前

    有点复杂,但如果您确定参数不包含“;”字符,您可以首先将其替换为“\n”字符,像之前一样执行grep,并使用backreferences将其传输到sed。

    sed 's/;/\n/g' ~/Desktop/greptest.txt 
    | grep -o findMe\([[:space:]]*[\'\"].*[\'\"][[:space:]]*\)
    | sed 's/\(.*findMe( "*\)\(.*\)\(" *)\).*/\2/g'
    

    演示文件:

    aksdbajksbd
    alsdnlkasnd
    asfindMe( "bar"  );alsndkfindMe( "baz" );sdasd
    asdadsads
    asdad
    

    输出:

    bar
    baz