matchstr在vimscript中不匹配正则表达式

时间:2013-12-20 19:15:12

标签: regex vim

以下vimscript代码在函数内部并且没有匹配,我不明白为什么。

let curLine= '[exec] setup/src/LinkedList.cs(6,15): warning CS0659:'
echo curLine
let matchs= matchstr(curLine,'[(][0-9]+[,][0-9]+[)]')
if matchs == ''
    echo 'no match'
    return
endif
echo 'match found'

当我在Vim中运行该功能时,“无匹配”被回显。我究竟做错了什么?我尝试使用http://regexpal.com/测试这个正则表达式,它似乎按照我期望的方式工作(内部的行和字符编号的括号被突出显示)

2 个答案:

答案 0 :(得分:3)

应该是这样的:

let matchs= matchstr(curLine,'[(][0-9]\+[,][0-9]\+[)]')
  

匹配总是像设置'magic'和'cpoptions'那样完成   空。

答案 1 :(得分:1)

尽管此答案最初是由肯特回答的,这为OP解决了问题,但由于我在他的回答下的评论中提到的原因,我本人对他的回答非常不满意。因此,这是我对这种情况下实际操作的解释。


匹配模式的问题在于您的+量词不能解释为量词,因为默认情况下,“魔术模式”不会将其解释为特殊字符。可以通过以下方式解决此问题:将魔术模式设置为“非常魔术”,使其表现得像您在问题中所描述的那样,或者在:help magic中列出的任何特殊字符前面加上必要的反斜杠。未列出的范围类似于您正在此处选择[0-9]的范围。这些只能在“魔术”或“非常魔术”模式下工作。

考虑到您处于常规的“魔术”模式,您需要对量词进行转义,并且除$.*~[]中的特殊字符外,无需对特殊字符进行任何处理。这意味着您的代码将最有效地如下所示:

let matchs= matchstr(curLine,'([0-9]\+,[0-9]\+)')

为简便起见,这里我将[(][,][)]更改为它们各自的纯文本字符,因为在常规的“魔术模式”下,它们不需要特殊的转义方式。为了使它解释为量词,我也逃脱了+,这与肯特在此问题的其他答案中所做的一样。

使表达式完全按照您的要求工作的另一种方法是在表达式前加上\v。这会将您的模式转变为“非常魔术”模式,其行为就像您在问题中可能期望的那样:

let matchs= matchstr(curLine,'\v[(][0-9]+[,][0-9]+[)]')

或者使用更短的语法,通过用反斜杠而不是组将转义符转义,并且不转义逗号(因为它不是特殊字符):

let matchs= matchstr(curLine,'\v\([0-9]+,[0-9]+\)')

这三行中的任何一条都可以解决您的问题。

同样,有关在特定“魔术”模式下需要转义或不需要转义的字符的完整列表,请参见:help magic。您也可以访问https://andrewra.dev/2011/05/08/vim-regexes/,找到一个说明其中一些概念的博客。