Подтвердить что ты не робот

Regex - заменить последовательность одного символа одинаковым числом другого символа

Скажем, у меня есть строка вроде этого:

=====

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

-----

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

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

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

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

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

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

или это:

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

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

4b9b3361

Ответ 1

Это возможно с помощью 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 ===="

Ответ 2

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

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

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