Trattino all'interno degli insiemi nelle espressioni regolari JavaScript
Il trattino è anch'esso un carattere speciale all'interno di [ ]
(ma all'esterno no). Se avete bisogno del trattino stesso come carattere,
mettetelo in una posizione dove non verrà interpretato come separatore
di un intervallo.
Perché è importante: potreste creare un intervallo di caratteri senza
accorgervene. Ad esempio, in questo modo - '[:-@]' - pensate di
selezionare i due punti, il trattino e la chiocciola, ma in realtà
ottenete l'intervallo di caratteri tra : e @. In questo
intervallo sono inclusi i seguenti caratteri: ? < = > : ;
Da dove vengono? Dalla tabella ASCII - i due punti hanno un numero inferiore rispetto alla chiocciola - e quindi si forma un intervallo. Cioè tutti gli intervalli sono determinati dalla tabella ASCII (volendo, ci si può sfruttare).
Come risolvere il problema: mettete il carattere trattino
in una posizione dove sicuramente non verrà interpretato come
carattere di intervallo, ad esempio all'inizio o alla fine
(cioè dopo [ o prima di ]).
Si può anche escape il trattino - in questo caso
indicherà sé stesso indipendentemente dalla
posizione. Ad esempio, invece di [:-@] scrivere
[:\-@] - e non ci sarà più un intervallo, ma
ci saranno tre caratteri - due punti, trattino e chiocciola
@.
Esempio
Nel seguente esempio il modello di ricerca è questo:
cifra 1, poi una lettera da 'a'
a 'z', poi cifra 2:
let str = '1a2 1-2 1c2 1z2';
let res = str.replace(/1[a-z]2/g, '!');
Di conseguenza, nella variabile verrà memorizzato quanto segue:
'! 1-2 ! !'
Esempio
Ora escape il trattino. Di conseguenza
il modello di ricerca è questo: cifra 1, poi
lettera 'a', o trattino, o lettera 'z',
poi cifra 2:
let str = '1a2 1-2 1c2 1z2';
let res = str.replace(/1[a\-z]2/g, '!');
Di conseguenza, nella variabile verrà memorizzato quanto segue:
'! ! 1c2 !'
Esempio
Si può semplicemente spostare il trattino, senza escape:
let str = '1a2 1-2 1c2 1z2';
let res = str.replace(/1[az-]2/g, '!');
Di conseguenza, nella variabile verrà memorizzato quanto segue:
'! ! 1c2 !'
Esempio
Nel seguente esempio il modello di ricerca è questo:
il primo carattere è una lettera minuscola o
un trattino '-', poi due lettere 'x':
let str = 'axx Axx -xx @xx';
let res = str.replace(/[a-z-]xx/g, '!');
Di conseguenza, nella variabile verrà memorizzato quanto segue:
'! Axx ! @xx'
Esempio
Nel seguente esempio il modello di ricerca è questo:
il primo carattere è una lettera minuscola, maiuscola
o un trattino '-', poi due lettere
'x':
let str = 'axx Axx -xx @xx';
let res = str.replace(/[a-zA-Z-]xx/g, '!');
Di conseguenza, nella variabile verrà memorizzato quanto segue:
'! ! ! @xx'
Esempio
Si può posizionare il trattino tra due intervalli - lì sicuramente non creerà un altro intervallo:
let str = 'axx 9xx -xx @xx';
let res = str.replace(/[a-z-0-9]xx/g, '!');
Di conseguenza, nella variabile verrà memorizzato quanto segue:
'! ! ! @xx'
Problemi pratici
Data la stringa:
let str = 'xaz xBz xcz x-z x@z';
Trovate tutte le stringhe secondo il seguente modello:
lettera 'x', lettera maiuscola o minuscola
o trattino, lettera 'z'.
Data la stringa:
let str = 'xaz x$z x-z xcz x+z x%z x*z';
Trovate tutte le stringhe secondo il seguente modello:
lettera 'x', poi o dollaro, o
trattino o più, poi lettera 'z'.