2012-04-02 73 views
0
<?php echo $form->create(); ?> 
    <?php echo $form->hidden('id'); ?> 
    <?php echo $form->input('name')); ?> 
    <?php echo $form->submit('Save'); ?> 
<?php echo $form->end(); ?> 

我想替換「;?」與「?」。vi用兩個問號替代一個問號

我用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

\?是其他程序正則表達式中正常?的vi正則表達式。

你可以看看:h regex來驗證這個(或者更確切地說是:h E61)。

因此,當使用; \?時,您匹配;(無空格)和;<space>(一個空格)。從這些匹配中,最貪婪的(儘可能多地參見E61)將被替換爲?,從而在存在空間時產生兩個問號(一個新的和一個新的)。

正確表達將是:s/; ?/ ?/g

編輯:固定解釋更精確。

1

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

; \?比賽;<space>零次或一次,並將其與?替換它們。
所以你得到原來的?與另一?