Реализация регулярного выражения для замены группы ее версией в нижнем регистре

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
55
0
44 278
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

В Perl есть

$string =~ tr/[A-Z]/[a-z]/;

[A-Z]? Это был пример. Тем не менее, я проголосовал за ответ j_random_hacker.

Hank Gay 09.01.2009 14:10

Большинство реализаций 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.

Ciro Santilli新疆棉花TRUMP BAN BAD 25.04.2019 10:34

Если ваша версия регулярного выражения поддерживает это, вы можете использовать \ L, например, в оболочке POSIX:

sed -r 's/(^.*)/\L\1/'

Похоже, что это работает в удивительном количестве наборов регулярных выражений, даже если вы не находитесь в среде, подобной оболочке.

Tim 27.06.2013 02:28

@Tim: Согласен, даже Notepad ++ поддерживает это.

Nelson Rothermel 15.08.2013 22:21

Это не работает в zsh или bash на OSX (да, я использую -E вместо -r).

dcow 21.12.2014 22:13

BSD sed слишком ограничен. В OS X используйте Homebrew и вместо этого установите gnu-sed. Тогда это работает.

Kim 22.12.2014 12:19

Работает в команде Linux rename, которая, по крайней мере, в Ubuntu 14 представляет собой сценарий Perl (/ usr / bin / prename).

Camille Goudeseune 15.06.2015 18:45

Поскольку * является жадным, а . обозначает любой символ, вам не нужно привязывать шаблон к ^. С помощью gnu sed вы также можете удалить группу захвата и переключатель -r и написать: sed 's/.*/\L&/'. С другой стороны, запись sed --posix 's/\(.*\)/\L\1/' не работает с gnu sed (и добавьте L в начале строки).

Casimir et Hippolyte 28.10.2017 22:01

Если вы используете такой редактор, как 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 I've tested this in both TextMate and SublimeText and it works as-is, but some editors use \1 instead of $1. Try both and see which your editor uses.

2 Я только что вытащил это регулярное выражение из своей истории. Я всегда настраиваю регулярные выражения при их использовании, и я не могу обещать, что это будет окончательная версия, поэтому я не предполагаю, что он подходит для описанной цели, и особенно с SQL, отформатированным иначе, чем SQL, над которым я работал, просто это конкретный пример понижения в регулярных выражениях. YMMV. UAYOR.

Хорошо, Intellij IDEA тоже поддерживает это

Pieter De Bie 03.12.2017 17:57

В нескольких ответах отмечалось использование \L. Тем не менее, \E также стоит знать, если вы используете \L.

\L converts everything up to the next \U or \E to lowercase. ... \E turns 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' *

Другие вопросы по теме