vi替换为两个问号而不是一个问号

时间:2012-04-02 10:11:46

标签: regex vi

<?php echo $form->create(); ?> 
   <?php echo $form->hidden('id'); ?> 
   <?php echo $form->input('name')); ?> 
   <?php echo $form->submit('Save'); ?> 
<?php echo $form->end(); ?>   

我想替换“;?”用“?”。

我使用vi命令“:%s /; \?/ \?/ g”来做到这一点。我得到了以下输出

<?php echo $form->create() ??> 
   <?php echo $form->hidden('id') ??> 
   <?php echo $form->input('name')) ??> 
   <?php echo $form->submit('Save') ??> 
<?php echo $form->end() ??> 

实际上,我需要以下输出。

<?php echo $form->create() ?>
   <?php echo $form->hidden('id') ?>
   <?php echo $form->input('name')) ?>
   <?php echo $form->submit('Save') ?>
<?php echo $form->end() ?>

你能解释一下这种奇怪的行为吗?

2 个答案:

答案 0 :(得分:2)

\?是其他程序正则表达式中普通?的vi-regular-expression。

您可以查看:h regex来验证这一点(或更准确地说:h E61)。

因此,在使用; \?时,您匹配;(无空格)和;<space>(一个空格)。从这些匹配中,最贪婪的(见E61 - 尽可能多)将被替换为?,从而在存在空格时产生两个问号(一个新问号和一个旧问号)。 p>

正确的表达方式是:s/; ?/ ?/g

编辑:修正了更精确的解释。

答案 1 :(得分:1)

:%s/; \?/ \?/g

; \?匹配;<space>零次或一次,并将其替换为?
因此,您可以使用另一个?获得原始?