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

Regex, чтобы заменить группу своей строчной версией

Есть ли какая-либо реализация регулярного выражения, позволяющая заменить группу в регулярном выражении строчной версией?

4b9b3361

Ответ 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 вы можете передать функцию обратного вызова при замене, поэтому вы можете просто вернуть младшую версию соответствия из обратного вызова.