Как сохранить те же самые подстроки в регулярных выражениях vim - PullRequest
3 голосов
/ 21 апреля 2010

В идеале я бы хотел vim-ответ на этот вопрос:

Я хочу изменить

[*, 1, *, *] to [*, 2, *, *]

Здесь звезды обозначают отдельные символы в подстроке, которые я хотел бы оставить без изменений. Например

[0, 1, 0, 1] to [0, 2, 0, 1]
[1, 1, 1, 1] to [1, 2, 1, 1]

Если люди знают, как это сделать на Perl, Python или чем-то еще, это было бы одинаково хорошо. Приветствия

Ответы [ 5 ]

4 голосов
/ 21 апреля 2010

Это работает:)

1,$s/\[\(\d\+\),\s\+\d\+,\s\+\(\d\+\),\s\+\(\d\+\)\]/[\1, 2, \2, \3]/g

или

%s/\[\(\d\+\),\s\+\d\+,\s\+\(\d\+\),\s\+\(\d\+\)\]/[\1, 2, \2, \3]/
2 голосов
/ 21 апреля 2010

Следующее должно делать то, что вы хотите:

:%s/\(\[[^,]*, *\)\(\d\)\([^]]*\]\)/\=submatch(1) . (submatch(2)+1) . submatch(3)/

В Vim, то есть.

1 голос
/ 21 апреля 2010

Обратите внимание, что при использовании регулярных выражений для подстановок / модификаций важно сосредоточиться вокруг той части строки, которую вы хотите изменить. Вот короткое регулярное выражение, чтобы делать то, что вы хотите (в Perl), которое иллюстрирует эту идею с вашими данными.

Предполагается, что $ line содержит строку, которую вы хотите изменить

 my $two=2;  
 $line =~ s/(,\s+)\d+/\1$two/;

Регулярное выражение ищет первую запятую, совпадает с ней и произвольным числом пробелов после запятой. Это запомнилось в первой обратной ссылке. После этого он соответствует произвольному количеству цифр. Наконец, он заменяет то, что совпало со строкой в ​​первой обратной ссылке, за которой следует 2. Применение этого к вашим образцам данных дает
[0, 1, 0, 1] становится [0, 2, 0, 1]
[1, 1, 1, 1] становится [1, 2, 1, 1]

1 голос
/ 21 апреля 2010

Этот короче и немного более общего назначения.

:%s/\(\[[^,],\s*\)1,/\12,/

Шаблону не важно, что находится в первом слоте списка, и он не смотрит на остальную часть списка. Это может быть лучше или хуже, в зависимости от того, что именно вы пытаетесь сделать.

1 голос
/ 21 апреля 2010

Если это строки в Python

>>> a = "[0, 1, 0, 1]"
>>> b = a[:4] + '2' + a[5:]
>>> b
'[0, 2, 0, 1]'

Списки немного более тривиальны:

>>> c = [0, 1, 0, 1]
>>> c[1] = 2
>>> c
[0, 2, 0, 1]
>>>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...