<?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() ?>
你能解释一下这种奇怪的行为吗?
答案 0 :(得分:2)
\?
是其他程序正则表达式中普通?
的vi-regular-expression。
您可以查看:h regex
来验证这一点(或更准确地说:h E61
)。
因此,在使用; \?
时,您匹配;
(无空格)和;<space>
(一个空格)。从这些匹配中,最贪婪的(见E61 - 尽可能多)将被替换为?
,从而在存在空格时产生两个问号(一个新问号和一个旧问号)。 p>
正确的表达方式是:s/; ?/ ?/g
编辑:修正了更精确的解释。
答案 1 :(得分:1)
:%s/; \?/ \?/g
; \?
匹配;<space>
零次或一次,并将其替换为?
。
因此,您可以使用另一个?
获得原始?
。