




В Perl есть
$string =~ tr/[A-Z]/[a-z]/;
Большинство реализаций Regex позволяют передавать функцию обратного вызова при выполнении замены, поэтому вы можете просто вернуть версию совпадения в нижнем регистре из обратного вызова.
В Perl вы можете:
$string =~ s/(some_regex)/lc($1)/ge;
Опция /e приводит к тому, что выражение замены интерпретируется как код Perl для оценки, возвращаемое значение которого используется как окончательное значение замены. lc($x) возвращает версию $x в нижнем регистре. (Не уверен, но я предполагаю, что lc() будет правильно обрабатывать международные символы в последних версиях Perl.)
/g означает глобальное совпадение. Не используйте g, если вам нужна только одна замена.
Perl также поддерживает синтаксис \L, например s/(some_regex)/\L$1/g, проверено 5.26.
Если ваша версия регулярного выражения поддерживает это, вы можете использовать \ L, например, в оболочке POSIX:
sed -r 's/(^.*)/\L\1/'
Похоже, что это работает в удивительном количестве наборов регулярных выражений, даже если вы не находитесь в среде, подобной оболочке.
@Tim: Согласен, даже Notepad ++ поддерживает это.
Это не работает в zsh или bash на OSX (да, я использую -E вместо -r).
BSD sed слишком ограничен. В OS X используйте Homebrew и вместо этого установите gnu-sed. Тогда это работает.
Работает в команде Linux rename, которая, по крайней мере, в Ubuntu 14 представляет собой сценарий Perl (/ usr / bin / prename).
Поскольку * является жадным, а . обозначает любой символ, вам не нужно привязывать шаблон к ^. С помощью gnu sed вы также можете удалить группу захвата и переключатель -r и написать: sed 's/.*/\L&/'. С другой стороны, запись sed --posix 's/\(.*\)/\L\1/' не работает с gnu sed (и добавьте L в начале строки).
Если вы используете такой редактор, как SublimeText или TextMate1, есть большая вероятность, что вы можете использовать
\L$1
в качестве замены, где $1 относится к чему-то из регулярного выражения, которое вы заключили в круглые скобки. Например, 2, вот что-то, что я использовал, чтобы убрать имена полей в некотором SQL, поместив все справа от 'as' в конце любой заданной строки. Сначала регулярное выражение "найти":
(as|AS) ([A-Za-z_]+)\s*,$
а затем выражение замены:
$1 '\L$2',
Если вы используете Vim (или, предположительно, gvim), вы захотите использовать \L\1 вместо \L$1, но есть еще одна проблема, о которой вам нужно знать: Vim меняет синтаксис между буквенными скобками и экранированными скобками. Итак, чтобы обозначить часть регулярного выражения, которая будет включена в замену («захваченная»), вы будете использовать \( в начале и \) в конце. Думайте о \ как о - вместо экранирования специального символа, чтобы сделать его буквальным, - как о начале специального символа (как в случае с \s, \w, \b и т. д.). Это может показаться странным, если вы к этому не привыкли, но на самом деле это совершенно логично, если вы думаете об этом с точки зрения Vim.
\1 instead of $1. Try both and see which your editor uses.
2 Я только что вытащил это регулярное выражение из своей истории. Я всегда настраиваю регулярные выражения при их использовании, и я не могу обещать, что это будет окончательная версия, поэтому я не предполагаю, что он подходит для описанной цели, и особенно с SQL, отформатированным иначе, чем SQL, над которым я работал, просто это конкретный пример понижения в регулярных выражениях. YMMV. UAYOR.
Хорошо, Intellij IDEA тоже поддерживает это
В нескольких ответах отмечалось использование \L. Тем не менее, \E также стоит знать, если вы используете \L.
\Lconverts everything up to the next\Uor\Eto lowercase. ...\Eturns off case conversion.(Source: 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' *
[A-Z]? Это был пример. Тем не менее, я проголосовал за ответ j_random_hacker.