Regex для замены всех вхождений данного персонажа, ТОЛЬКО после данного совпадения - PullRequest
0 голосов
/ 11 августа 2010

Для простоты предположим, что у нас есть входные строки в следующем формате:

*text1*|*text2*

Итак, я хочу оставить text1 в покое и удалить все пробелы в text2 .

Это может быть легко, если бы у нас не было text1 , простой поиск и замена, как это сделало бы:

%s/\s//g

но в этом контексте я не знаю, что делать.

Я пробовал что-то вроде:

%s/\(.*|\S*\).\(.*\)/\1\2/g

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

Таким образом, предпочтительным ограничением является решить эту проблему только одним поиском и заменить .И, хотя я использовал синтаксис Vim, использовал вариант с регулярным выражением, с которым вам удобнее всего отвечать, я имею в виду, что, возможно, вам нужны некоторые функции, предлагаемые только Perl.решение для Vim:

%s:\(|.*\)\@<=\s::g

Ответы [ 3 ]

3 голосов
/ 12 августа 2010

Итак, у вас есть строка с одним каналом (|) и вы хотите заменить только те пробелы, которые не предшествуют каналу?

s/\s+(?![^|]*\|)//g
3 голосов
/ 11 августа 2010

В одну сторону, в perl:

s/(^.*\||(?=\s))\s*/$1/g

Конечно, гораздо более высокая эффективность возможна, если вы разрешите более одного поиска и замены.

0 голосов
/ 12 августа 2010

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

Это

s/(.*?\|)(.*)(?{ $x = $2; $x =~ s:\s::g })/$1$x/

теоретически должно работать, но я получил "Недостаточно памяти!"ошибка, которую можно исправить, заменив '\ s' пробелом:

s/(.*?\|)(.*)(?{ $x = $2; $x =~ s: ::g })/$1$x/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...