正则表达式(vim)星号替换

3
在这段简单的代码中:
char **s = NULL;
char **s1 = NULL;

我希望将“**s”替换为“*s”,结果应为:
char *s = NULL;
char **s1 = NULL; 

但是如果我尝试:
%s/\<\*\*s\>/\*s/g

替换失败。 如果尝试这样做:

%s/\*\*s/\*s/g

结果是:

char *s = NULL;
char *s1 = NULL; 

替换成功,但同时“**s1”也被替换了

为什么第一种方法失败了?


为什么第一个有 \<\> - Brigand
2
请仔细阅读 http://vim.wikia.com/wiki/Search_and_replace,以了解有关搜索和替换的更多信息。 - Samuel Panicucci
1
顺便说一下,这是一个有效的代码:%s/\**s\s/*s /。你的第二个代码之所以两个都符合是因为你没有指定“s”后面跟着什么。 - Brigand
没错,但我想理解为什么第一个不起作用。 - Samuel Panicucci
1
第一个不起作用是因为你有小于和大于符号...它们在输入中没有出现。 - Brigand
1
小于号和大于号需要精确匹配才能替换,实际上如果我执行:%s/<NULL>/Pippo/g,替换就是正确的。 - Samuel Panicucci
1个回答

2
在vim正则表达式中,\<表示单词边界。在空格和星号之间没有单词边界 - 两者都不是单词的一部分 - 因此\<\*不匹配。你需要这个:\b\*
%s/\*\*s\>/\*s/g

这个问题可以通过以下方法解决,同时在s之后仍保留单词边界(以免匹配到*s1)。(\<\>经常成对使用来匹配整个单词,但它们不一定要成对出现。任何一个都可以单独使用。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接