ES2015 ha introdotto molte nuove funzionalità nel linguaggio JavaScript, tra cui
miglioramenti significativi alla sintassi delle espressioni regolari con Unicode
(/u
) e flag fissi (/y
). Ma lo sviluppo non si è arrestato da allora. Nella
stretta collaborazione con altri membri del TC39 (l'organismo per gli standard ECMAScript),
il team V8 ha proposto e co-progettato diverse nuove funzionalità per
sono ancora più efficaci.
Queste funzioni sono attualmente proposte per l'inclusione nel file JavaScript e la specifica del prodotto. Nonostante le proposte non siano state pienamente accettate, già alla Fase 3 del processo TC39. che abbiamo implementato dietro una bandiera (vedi sotto) per poter fornire una progettazione tempestiva e il feedback sull'implementazione ai rispettivi autori prima che la specifica sia finalizzata.
Questo post del blog offre un'anteprima di questo entusiasmante futuro. Se desideri
segui gli esempi successivi, abilita il codice JavaScript sperimentale
funzionalità di chrome://flags/#enable-javascript-harmony
.
Acquisizioni con nome
Le espressioni regolari possono contenere le cosiddette acquisizioni (o gruppi), che possono acquisire una parte del testo corrispondente. Finora, gli sviluppatori potevano fare riferimento solo queste acquisizioni in base al loro indice, che è determinato dalla posizione acquisire all'interno dello schema.
const pattern = /(\d{4})-(\d{2})-(\d{2})/u;
const result = pattern.exec('2017-07-10');
// result[0] === '2017-07-10'
// result[1] === '2017'
// result[2] === '07'
// result[3] === '10'
Tuttavia, le espressioni regolari sono già notoriamente difficili da leggere, scrivere e mantenere e i riferimenti numerici possono aggiungere ulteriori complicazioni. Ad esempio, in pattern più lunghi, può essere difficile determinare l'indice di un acquisizione:
/(?:(.)(.(?<=[^(])(.)))/ // Index of the last capture?
Peggio ancora, le modifiche a un modello possono potenzialmente spostare gli indici di tutte acquisizioni esistenti:
/(a)(b)(c)\3\2\1/ // A few simple numbered backreferences.
/(.)(a)(b)(c)\4\3\2/ // All need to be updated.
Le acquisizioni con nome sono una funzionalità di prossima implementazione che aiuta a mitigare questi problemi consentendo agli sviluppatori di assegnare nomi alle acquisizioni. La sintassi è simile a Perl, Java, .Net e Ruby:
const pattern = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/u;
const result = pattern.exec('2017-07-10');
// result.groups.year === '2017'
// result.groups.month === '07'
// result.groups.day === '10'
È possibile fare riferimento alle acquisizioni con nome anche da backreference denominati e
String.prototype.replace
:
// Named backreferences.
/(?<LowerCaseX>x)y\k<LowerCaseX>/.test('xyx'); // true
// String replacement.
const pattern = /(?<fst>a)(?<snd>b)/;
'ab'.replace(pattern, '$<snd>$<fst>'); // 'ba'
'ab'.replace(pattern, (m, p1, p2, o, s, {fst, snd}) => fst + snd); // 'ba'
I dettagli completi di questa nuova funzionalità sono disponibili nella proposta specifica.
flag puntoAll
Per impostazione predefinita, l'atomo .
nelle espressioni regolari corrisponde a qualsiasi carattere tranne
per i terminatori di riga:
/foo.bar/u.test('foo\nbar'); // false
Una proposta introduce la modalità dotAll, attivata tramite il flag /s
. In puntoTutti
, .
corrisponde anche ai terminatori di riga.
/foo.bar/su.test('foo\nbar'); // true
I dettagli completi di questa nuova funzionalità sono disponibili nella proposta specifica.
Sequenza di escape della proprietà Unicode
Con l'introduzione della tecnologia Unicode in ES2015, all'improvviso ci sono molte altre che possono essere considerati numeri, ad esempio la cifra uno cerchiata: ①; o considerati caratteri verbali, ad esempio il carattere cinese per la neve: 雪.
Nessuno di questi può essere abbinato a \d
o \w
. Modifica del significato di
queste abbreviazioni interromperebbero i pattern esistenti di espressioni regolari.
Le nuove sequenze di escape delle proprietà vengono
introdotto.
Tieni presente che sono disponibili solo per le espressioni regolari Unicode-aware indicate con
dal flag /u
.
/\p{Number}/u.test('①'); // true
/\p{Alphabetic}/u.test('雪'); // true
Il contrario può essere abbinato da \P
.
/\P{Number}/u.test('①'); // false
/\P{Alphabetic}/u.test('雪'); // false
Il consorzio Unicode definisce molte altre proprietà, ad esempio per i simboli matematici o caratteri hiragana giapponesi:
/^\p{Math}+$/u.test('∛∞∉'); // true
/^\p{Script_Extensions=Hiragana}+$/u.test('ひらがな'); // true
L'elenco completo delle classi di proprietà Unicode supportate è disponibile nella proposta di specifica. Per ulteriori esempi, consulta questo articolo informativo.
Asserzioni Lookbehind
Le asserzioni Lookahead hanno fatto parte della sintassi delle espressioni regolari di JavaScript sin dall'inizio. Le loro controparti, le asserzioni lookbehind, stanno finalmente introdotto. Alcuni di voi ricorda che fa parte della V8 già da un po' di tempo. Abbiamo anche utilizza le asserzioni lookbehind "under the hood" per implementare il flag Unicode specificato in ES2015.
Il nome descrive già abbastanza bene il suo significato. Offre un modo per limitare un pattern che corrisponda solo se preceduto dal pattern nel gruppo lookbehind. it è disponibile sia con sapori corrispondenti che non corrispondenti:
/(?<=\$)\d+/.exec('$1 is worth about ¥123'); // ['1']
/(?<!\$)\d+/.exec('$1 is worth about ¥123'); // ['123']
Per ulteriori dettagli, consulta il precedente post del blog dedicato alle asserzioni lookbehind ed esempi in casi di test V8 correlati.
Ringraziamenti
Questo post del blog non sarebbe completo senza menzionare alcune delle persone che hanno lavorato duramente per renderlo possibile: in particolare i campioni di lingua Mathias Bynens, Dan Ehrenberg, Claude Pache, Brian Terlson, Thomas Wood, Gorkem Yakin e Irregexp guru Erik Corry; ma anche chiunque abbia ha contribuito alle specifiche della lingua e all'implementazione da parte di V8 di questi le funzionalità di machine learning.
Ci auguriamo che queste nuove funzioni relative alle espressioni regolari siano di tuo gradimento sono!