Regex - заменить последовательность одного символа одинаковым числом другого символа
Скажем, у меня есть строка вроде этого:
=====
и я хочу заменить его следующим:
-----
Я хочу заменить его только в том случае, если у него больше определенного символа (мы скажем > 3).
Итак, это должны быть замены:
=== -> ===
==== -> ----
===== -> -----
В приложении я хочу заменить все отметки заголовка уровня 1 на отметку с отметкой уровня 2 без изменения встроенных кодовых блоков.
Я знаю, что могу это сделать:
/=/-/g
, но это соответствует чему-либо с значком равенства (if (x == y)
), что нежелательно.
или это:
/===+/----/g
, но это не учитывает длину исходной согласованной строки.
Возможно ли это?
Ответы
Ответ 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 выполнить код в правой части выражения вместо того, чтобы просто разбирать его как строку.