Regexp匹配函数调用

时间:2018-02-09 15:27:18

标签: regex

我正在尝试编写一个正则表达式来匹配自动加载的Vimscript函数的调用。自动加载的函数名称如下所示:

foo#bar()
foo#bar#baz()

它们与脚本本地调用形成对比,如下所示:

s:foo()

但是我不想匹配函数定义,如下所示:

function foo#bar()
function foo#bar#baz()

我开始使用正则表达式来匹配函数名称:

(\w+(?:#\w+)+)\(

即。匹配foo#bar(foo#bar#baz(并捕获除开始括号以外的所有内容。

然后我添加了一个负面的lookbehind来排除前面带有function的函数名。

(?<!function )(\w+(?:#\w+)+)\(

但是,如果function foo#bar()匹配oo#bar(

所以我添加了一个单词边界:

(?<!function )\b(\w+(?:#\w+)+)\(

现在它根本不匹配function foo#bar()

但是,如果function foo#bar#baz()匹配bar#baz(。我明白为什么:#之后foo是一个单词边界。不幸的是,我无法弄清楚如何解决这个问题。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

试试这个正则表达式:

^(?!function)\w+(?:#\w+)+(?=\()

<强> Click for Demo

<强>解释

  • ^ - 断言行的开头
  • (?!function) - 负面预测以确保function
  • 不会立即跟随当前位置
  • \w+ - 匹配1个以上的单词字符(字母,数字和下划线)
  • (?:#\w+)+ - 匹配1个以上#后跟1个字符
  • (?=\() - 积极向前看以确保当前位置后跟(

答案 1 :(得分:1)

在您的负面观察中,还要添加#以确保您在#之后的位置不匹配

(?<!\bfunction |#)(\b\w+(?:#\w+)+)

另请注意在function之前和\w+之前使用字边界以避免错误匹配。

RegEx Demo