当单词不是(某些单词)时匹配Word()

时间:2019-02-15 14:39:26

标签: regex vim

特别是,我想匹配我的Javascript代码中的一组通用标准Javascript函数中没有的函数。换句话说,我想匹配用户定义的函数。我正在使用vim的正则表达式,但我不介意看到其他口味的解决方案。

据我所知,正则表达式会逐个字符地搜寻字符串,因此即使问题似乎很简单,按字符集进行思考也可能会出现问题。我已经尝试过否定的前瞻,并且您可能希望做的所有事情都是防止使不需要的功能的第一个字符不被匹配(即onsole.log而不是console.log)。

(?(?!(if)|(console\.log)|(function))\w+)\(.*\)

  

功能(深度,弹跳,弹跳,弹跳)

     

JSON.parse(localStorage [“ beards”])

     

console.log(“ sldkfjls” + dododo);

     

如果(嘟嘟声){

     

BLAH.blah.somefunc(arge,arg,arg);

https://regexr.com/

我希望能够通过一个函数进行爬网,并查看它在哪里调用其他用户自定义函数。我是否需要对匹配项进行后处理(即与另一个正则表达式映射)以拒绝我不想要的匹配项,或者是否可以在一个正则表达式中做到这一点?

1 个答案:

答案 0 :(得分:2)

foo以外的所有单词匹配的正则表达式的基本配方(按照Vim的正则表达式语法)是:

/\<\%(foo\>\)\@!\k\+\>/

请注意,否定的前瞻(\@!)本身如何需要结束声明(此处为\>),以避免它也排除仅以开始开头的任何内容表情!

应用于您的示例(不包括if(可能带有空格),console.logfunction,以(结尾),得出:

\<\%(\%(if *\|console\.log\|function\)(\)\@!\(\k\|\.\)\+\>(.*)

由于您似乎希望包括整个对象链(因此,JSON.parse而不只是parse),因此实际匹配项包括关键字字符(\k)和句点。这样做有一个复杂之处:否定的超前行将锁定在log()中的console.log()上,因为前导关键字边界声明(\<)也在那里匹配。我们还可以通过排除函数之前的句点来禁止匹配。也就是说,将\.\@<!放在两者之间:

\<\%(\%(if *\|console\.log\|function\)(\)\@!\.\@<!\(\k\|\.\)\+\>(.*)

这将仅突出显示以下呼叫:

JSON.parse(localStorage["beards"])
BLAH.blah.somefunc(arge, arg,arg);
foo.log(asdf)