Regex - заменить последовательность одного символа тем же номером другого символа - PullRequest
12 голосов
/ 07 сентября 2011

Допустим, у меня есть строка, подобная этой:

=====

, и я хочу заменить ее следующим:

-----

Я хочу заменить ее, только если она имеет болееопределенное число этого символа (скажем,> 3).

Итак, это должны быть замены:

=== -> ===
==== -> ----
===== -> -----

Приложение - я хочу заменить все заголовки уровня 1в уценке с отметкой уровня 2, без изменения встроенных блоков кода.

Я знаю, что могу сделать это:

/=/-/g, но это соответствует чему-либо со знаком равенства (if (x == y)), что нежелательно.

или это:

/===+/----/g, но это не учитывает длину исходной совпавшей строки.

Возможно ли это?

Ответы [ 2 ]

10 голосов
/ 07 сентября 2011

Это возможно с Perl:

my $string = "===== Hello World ====";
$string =~ s/(====+)/"-" x length($1)/eg;
# $string contains ----- Hello World ----

Флаг / e заставляет Perl выполнять выражение во второй части s ///.Вы можете попробовать это с помощью oneliner:

perl -e '$ARGV[0] =~ s/(====+)/"-" x length($1)/eg; print $ARGV[0]' "===== Hello World ===="
4 голосов
/ 07 сентября 2011

В зависимости от того, какой язык вы используете. По сути, в некоторых языках вы можете поместить код в правой части регулярного выражения, что позволит вам сделать что-то вроде этого:

s/(=+)/(length($1) > 3 ? "-" : "=") x length($1)/e

Флаг 'e' указывает Perl выполнять код в правой части выражения, а не просто анализировать его как строку.

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