以下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/测试这个正则表达式,它似乎按照我期望的方式工作(内部的行和字符编号的括号被突出显示)
答案 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/,找到一个说明其中一些概念的博客。