Есть ли какая-либо реализация регулярного выражения, позволяющая заменить группу в регулярном выражении строчной версией?
Regex, чтобы заменить группу своей строчной версией
Ответ 1
В Perl вы можете:
$string =~ s/(some_regex)/lc($1)/ge;
Опция /e
заставляет выражение замены интерпретироваться как Perl-код для оценки, возвращаемое значение которого используется как окончательное значение замены. lc($x)
возвращает нижнюю версию $x
. (Не уверен, но я полагаю, что lc()
корректно обрабатывает международные символы в последних версиях Perl.)
/g
означает соответствие по всему миру. Опустите g
, если требуется только одна замена.
Ответ 2
Если ваша версия regex поддерживает ее, вы можете использовать \L, как в оболочке POSIX:
sed -r 's/(^.*)/\L\1/'
Ответ 3
Если вы используете редактор, такой как SublimeText или TextMate 1 вы можете использовать
\L$1
как ваша замена, где $1
ссылается на что-то из обычного выражения, которое вы помещаете в круглые скобки. Например, 2 здесь что-то я использовал для ввода наименований полей в некотором SQL, получив все справа от "как" в конце любой строки. Сначала "найти" регулярное выражение:
(as|AS) ([A-Za-z_]+)\s*,$
а затем заменяющее выражение:
$1 '\L$2',
Если вы используете Vim (или предположительно gvim), тогда вы захотите использовать \L\1
вместо \L$1
, но есть еще одна морщина, о которой вам нужно знать: Vim меняет синтаксис между буквенными скобками символы и экранированные символы скобок. Поэтому, чтобы обозначить часть регулярного выражения, которое будет включено в замещение ( "захвачено" ), вы будете использовать \(
в начале и \)
в конце. Подумайте о \
как — вместо того, чтобы экранировать специальный символ, чтобы сделать его буквенным символом, обозначающим начало специального символа (например, \s
, \w
, \b
и т.д.). Поэтому может показаться странным, если вы не привыкли к этому, но на самом деле это совершенно логично, если вы думаете об этом в способе Vim.
1 Я тестировал это как в TextMate, так и в SublimeText, и он работает как есть, но некоторые редакторы используют
\1
вместо $1
. Попробуйте оба и посмотрите, что использует ваш редактор.
2 Я просто вытащил это регулярное выражение из своей истории. Я всегда настраиваю regexen при их использовании, и я не могу пообещать это окончательной версии, поэтому я не предлагаю, чтобы это соответствовало описанной цели, и особенно не с SQL-форматированием, отличным от SQL, над которым я работал, конкретный пример сглаживания в регулярных выражениях. YMMV. UAYOR.
Ответ 4
В нескольких ответах отмечено использование \L
Тем не менее, \E
также стоит знать, если вы используете \L
\L
преобразует все до следующего\U
или\E
в нижний регистр....\E
отключает преобразование регистра.(Источник: https://www.regular-expressions.info/replacecase.html)
Итак, предположим, что вы хотите использовать rename
в строчную часть некоторых имен файлов, например:
artist_-_album_-_Song_Title_to_be_Lowercased_-_MultiCaseHash.m4a
artist_-_album_-_Another_Song_Title_to_be_Lowercased_-_MultiCaseHash.m4a
Вы могли бы сделать что-то вроде:
rename -v 's/^(.*_-_)(.*)(_-_.*.m4a)/$1\L$2\E$3/g' *
Ответ 5
В Perl существует
$string =~ tr/[A-Z]/[a-z]/;
Ответ 6
В большинстве реализаций Regex вы можете передать функцию обратного вызова при замене, поэтому вы можете просто вернуть младшую версию соответствия из обратного вызова.