为什么:s命令正则表达式不理解'?'

时间:2012-07-13 11:55:48

标签: vim sed

当你尝试从一行中删除html标签时,一种可行的方法是使用:s命令并编写一个同时理解标签开头和结尾的正则表达式。我的意思是:

:s %</?center>%%g

但是这样,vim说它找不到任何东西。所以我不得不使用以下代码,它起作用了:

:s %</*center>%%g

为什么那个有效但另一个无效?不应该?说“之前的角色可以来过一次,也可能根本不会出现”?

3 个答案:

答案 0 :(得分:4)

您需要使用?转义\

参阅帮助页面:

:h pattern-overview

答案 1 :(得分:2)

它们不一样。

  

? (问号)匹配前一个字符 0或1次   只有,例如,colou?r会同时找到颜色(0次)和颜色   (1次)。   

     

*(星号或星号)匹配前一个字符 0或更多      时间,例如,tre *将找到树(2次)和胎面(1次)      和低谷(0次)。

你能告诉我们将被替换的比赛吗?

此外,我知道这种操作是使用该命令s/foo/bar/g完成的,该命令将用foo

替换bar的每个事件。

答案 2 :(得分:2)

如果你想使用这样的?必须使用vim的very magic正则表达式模式(\v),那么这也会解释<>作为单词边界所以现在他们需要被转义:

:%s,\v\</?center\>,,g

正如您所发现的,此处较短的选项是逃避?

:%s,</\?center>,,g

有关详情,请参阅:help /magic