Vim регулярное выражение для удаления всех, кроме последних двух цифр числа - PullRequest
8 голосов
/ 14 января 2009

У меня следующий текст в файле

23456789

Когда я попытался заменить приведенный выше текст с помощью команды

1,$s/\(\d\)\(\d\d\d\)\(\d\d\)*\>/\3\g

Я получаю 89. Разве это не должно быть 6789? Может кто-нибудь сказать мне, почему это 89.

Ответы [ 5 ]

4 голосов
/ 14 января 2009

Как написано, ваше регулярное выражение захватывает одну цифру, затем три цифры, а затем любое количество групп по две цифры в каждой. Поэтому третье совпадение всегда будет состоять из двух цифр, если оно существует. В вашем конкретном тестовом примере '89' находится в \ 4, а не \ 3.

Изменение регулярного выражения на

 1,$s/\(\d\)\(\d\d\d\)\(\d\d\+\)\>/\3\g
В результате

даст вам «6789», так как в третьей группе будет записано две или более цифры (до целого числа)

4 голосов
/ 14 января 2009

Вы хотите использовать здесь группу без захвата, например,

1,$s/\(\d\)\(\d\d\d\)\(\%(\d\d\)*\)\>/\3/g

, который дает 6789 в качестве результата здесь, и если ввод был изменен на

2345678

изменит строку на 278

1 голос
/ 14 января 2009

Группа 3 определяется длиной 2 цифры. Если вы хотите сопоставить последние 4 цифры, то вы хотите \(\d\d\d\d\) без * в конце. Если вы просто хотите сопоставить все цифры, кроме первых 4, поместите ваш * в соответствие группе, а не снаружи.

0 голосов
/ 31 мая 2010

Я попробовал этот в nvi, и он не работает. В vim это работает, только то, что вы должны исправить последний перевернутый тире перед g для тире, как это:

1,$s/\(\d\)\(\d\d\d\)\(\d\d\)*\>/\3/g

и заменяется 89. Причина в том, что вы говорите с *, что последний \ d \ d может повторяться ноль, один или несколько раз, а с> вы говорите границу конечного слова. С группой 3 вы говорите, что хотите группу las, но из-за * las две цифры (\ d \ d) равны 89. Вынув *, вы можете получить 6789. Как это:

1,$s/\(\d\)\(\d\d\d\)\(\d\d\)/\3/g

Остерегайтесь> кто играет хитрую роль, потому что с этим:: 1,$s/\(\d\)\(\d\d\d\)\(\d\d\)\>/\3 Вы получите 2389 лол! Потому что с точки зрения границы слова dddddd соответствует 456789 и заменяется на два последних dd, а это 89. Таким образом, вы получите 23 + 89 Сногсшибательное! LOL

0 голосов
/ 14 января 2009

Возможно, вы захотите (нужна дополнительная группа упаковки):

%s/\(\d\)\(\d\d\d\)\(\(\d\d\)*\)\>/\3\g

Хотя я не уверен, почему вы захватываете первые 2 группы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...