2012-04-02 3 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(); ?> 

Ich möchte ";?" Ersetzen mit "?".vi Ersetzen mit zwei Fragezeichen anstelle eines Fragezeichens

Ich habe den vi-Befehl ":% s /; \?/\?/G", um das zu tun. Ich habe folgende Ausgabe

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

Eigentlich brauche ich die folgende Ausgabe.

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

Können Sie die Erklärung für dieses seltsame Verhalten geben?

Antwort

2

Der \? ist der vi-reguläre Ausdruck für den normalen ? in anderen regulären Ausdrücken des Programms.

Sie können :h regex überprüfen, um dies zu überprüfen (oder genauer :h E61).

Wenn Sie also ; \? verwenden, passen Sie ; (kein Leerzeichen) und ;<space> (ein Leerzeichen). Aus diesen Übereinstimmungen wird die gierigste (siehe E61 - so viele wie möglich) durch eine ? ersetzt, was zu zwei Fragezeichen (einer neuen und der alten) führt, wenn ein Raum vorhanden ist.

Der richtige Ausdruck wäre: s/; ?/ ?/g

EDIT: Feste Erklärung genauer zu sein.

1

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

; \? Spiel ;<space> Null oder eine Zeit, und es ersetzt sie durch ?.
So erhalten Sie das Original ? mit einem anderen ?.