Domanda regex l'implementazione per sostituire il gruppo con la sua versione in minuscolo


Esiste qualche implementazione di regex che permetta di sostituire il gruppo in regex con la versione minuscola di esso?


44
2018-01-09 10:43


origine


risposte:


In Perl, puoi fare:

$string =~ s/(some_regex)/lc($1)/ge;

Il /e l'opzione fa in modo che l'espressione sostitutiva venga interpretata come codice Perl da valutare, il cui valore di ritorno viene utilizzato come valore di sostituzione finale. lc($x) restituisce la versione in minuscolo di $x. (Non sono sicuro, ma presumo lc() gestirà correttamente i caratteri internazionali nelle versioni Perl recenti.)

/g significa abbinare globalmente Ometti il g se vuoi solo una singola sostituzione.


30
2018-01-09 11:08



Se la tua versione regex lo supporta, puoi usare \ L, come in una shell POSIX:

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

54
2018-05-15 19:45



Se stai usando un editor come SublimeText o TextMate1, ci sono buone possibilità che tu possa usare

\L$1

come ricambio, dove $1 si riferisce a qualcosa dall'espressione regolare che si mette tra parentesi. Per esempio2, ecco qualcosa che ho usato per scartare i nomi dei campi in alcuni SQL, ottenendo tutto alla destra del 'come' alla fine di ogni linea data. Prima l'espressione regolare "trova":

(as|AS) ([A-Za-z_]+)\s*,$

e quindi l'espressione sostitutiva:

$1 '\L$2',

Se usi Vim (o presumibilmente gvim), allora vorresti usarlo \L\1 invece di \L$1, ma c'è un'altra ruga di cui devi essere a conoscenza: Vim inverte la sintassi tra caratteri di parentesi letterali e caratteri di parentesi di escape. Quindi, per designare una parte dell'espressione regolare da includere nella sostituzione ("catturata"), la userete \( all'inizio e \) alla fine. Pensa a \ as-invece di fuggire da un carattere speciale per renderlo un letterale-segnando l'inizio di un carattere speciale (come con \s, \w, \b e così via). Quindi può sembrare strano se non ci sei abituato, ma in realtà è perfettamente logico se ci pensi in modo Vim.


1 Ho provato questo in TextMate e SublimeText e funziona così com'è, ma alcuni editor usano \1 invece di $1. Prova entrambi e scopri quale editor usa.

2 Ho appena rimosso questa espressione regolare dalla mia storia. Ho sempre modificato le espressioni durante il loro utilizzo, e non posso prometterlo nella versione finale, quindi non sto suggerendo che sia adatto allo scopo descritto, e specialmente non con SQL formattato in modo diverso dall'SQL su cui stavo lavorando, solo che è un esempio specifico di downcasing nelle espressioni regolari. YMMV. UAYOR.


13
2018-01-23 15:52



In Perl, c'è

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

3
2018-01-09 10:47



La maggior parte delle implementazioni di Regex consentono di passare una funzione di callback quando si effettua una sostituzione, quindi è possibile semplicemente restituire una versione in lettere minuscole della corrispondenza dal callback.


2
2018-01-09 10:50



Diverse risposte hanno notato l'uso di \L. Però, \E vale la pena sapere se si utilizza \L.

\L converte tutto fino a quello successivo \U o \E in minuscolo. ... \E disattiva la conversione del caso.

(Fonte: https://www.regular-expressions.info/replacecase.html )

Quindi, supponiamo che tu volessi usare renamealla minuscola parte di alcuni nomi di file come questo:

artist_-_album_-_Song_Title_to_be_Lowercased_-_MultiCaseHash.m4a
artist_-_album_-_Another_Song_Title_to_be_Lowercased_-_MultiCaseHash.m4a

potresti fare qualcosa come:

rename -v 's/^(.*_-_)(.*)(_-_.*.m4a)/$1\L$2\E$3/g' *

1
2018-03-22 23:55