我正在尝试编写一个正则表达式来匹配自动加载的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
是一个单词边界。不幸的是,我无法弄清楚如何解决这个问题。
非常感谢任何帮助!
答案 0 :(得分:1)
试试这个正则表达式:
^(?!function)\w+(?:#\w+)+(?=\()
<强> Click for Demo 强>
<强>解释强>
^
- 断言行的开头(?!function)
- 负面预测以确保function
\w+
- 匹配1个以上的单词字符(字母,数字和下划线)(?:#\w+)+
- 匹配1个以上#
后跟1个字符(?=\()
- 积极向前看以确保当前位置后跟(
答案 1 :(得分:1)
在您的负面观察中,还要添加#
以确保您在#
之后的位置不匹配
(?<!\bfunction |#)(\b\w+(?:#\w+)+)
另请注意在function
之前和\w+
之前使用字边界以避免错误匹配。