正则表达式:递归搜索内容并返回结果

时间:2014-02-17 12:49:36

标签: regex osx-mavericks

我有几个调用某个函数的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。

提前致谢!

//编辑

感谢Vasili正确的正则表达式,感谢Abhiskek将我指向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 个答案:

答案 0 :(得分:0)

正则表达式

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

说明

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

在线示例:

Regex101

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

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

  • 匹配所有不关闭括号([^)]+)的内容可确保您的正则表达式不会过度扩展参数并进入另一个函数参数,例如,您将不会匹配此项:{{1} }

答案 1 :(得分:0)

有点复杂,但如果您确定您的参数不包含';'字符,您可以先用'\ n'字符替换它,像以前一样执行grep,然后通过反向引用它来管道。

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