ES2015 a introduit de nombreuses nouvelles fonctionnalités dans le langage JavaScript, y compris
des améliorations significatives de la syntaxe des expressions régulières avec le format Unicode ;
(/u
) et persistants (/y
). Mais le développement ne s'est pas arrêté depuis. Dans
une étroite collaboration avec les autres membres de TC39 (l'organisme de normalisation ECMAScript),
l'équipe V8 a proposé et conçu plusieurs nouvelles fonctionnalités afin de rendre
encore plus puissantes.
Ces fonctionnalités sont actuellement proposées pour être intégrées au code JavaScript spécifique. Même si les propositions n'ont pas été entièrement acceptées, elles sont déjà à l'étape 3 du processus TC39. Nous avons mis en œuvre ces caractéristiques derrière un drapeau (voir ci-dessous) afin de pouvoir fournir une conception en temps opportun et les commentaires sur la mise en œuvre aux auteurs respectifs des propositions avant la la spécification soient finalisées.
Cet article de blog vous donne un aperçu de cet avenir passionnant. Si vous souhaitez
suivez les exemples à venir, activez le code JavaScript expérimental
sur chrome://flags/#enable-javascript-harmony
.
Captures nommées
Les expressions régulières peuvent contenir ce que l'on appelle des captures (ou groupes), qui permettent pour capturer une partie du texte correspondant. Jusqu'à présent, les développeurs ne pouvaient se référer ces captures par leur index, lequel est déterminé par la position capturer dans le modèle.
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'
Les expressions régulières sont déjà connues pour être difficiles à lire, à écrire et maintenir, et les références numériques peuvent compliquer davantage la tâche. Par exemple, dans des schémas plus longs, il peut être difficile de déterminer l'index d'une capture:
/(?:(.)(.(?<=[^(])(.)))/ // Index of the last capture?
Pire encore, toute modification d'un modèle peut modifier les indices de tous captures existantes:
/(a)(b)(c)\3\2\1/ // A few simple numbered backreferences.
/(.)(a)(b)(c)\4\3\2/ // All need to be updated.
Les captures nommées seront bientôt une fonctionnalité qui permettra d'atténuer ces problèmes en permettant aux développeurs d'attribuer un nom aux captures. La syntaxe est similaire à celle de Perl, Java, .Net et 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'
Les captures nommées peuvent également être référencées à l'aide de références arrière nommées et via
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'
Pour en savoir plus sur cette nouvelle fonctionnalité, consultez la proposition de spécifications.
Indicateur dotAll
Par défaut, l'atome .
dans les expressions régulières correspond à n'importe quel caractère, sauf
pour les sauts de ligne:
/foo.bar/u.test('foo\nbar'); // false
Une proposition introduit le mode dotAll, activé via l'indicateur /s
. Dans pointAll
mode, .
établit également une correspondance avec les sauts de ligne.
/foo.bar/su.test('foo\nbar'); // true
Pour en savoir plus sur cette nouvelle fonctionnalité, consultez la proposition de spécifications.
Échappements de propriété Unicode
Avec la prise en compte d'Unicode introduite dans ES2015, il y a soudainement beaucoup plus des caractères pouvant être considérés comme des nombres, par exemple le chiffre 1 dans un cercle: ①; ou considérés comme des caractères de mot, comme le caractère chinois pour "neige" : 雪.
Aucune de ces options ne peut correspondre à \d
ou \w
. Changer la signification de
ces raccourcis briseraient les modèles
d'expression régulière existants.
À la place, les nouvelles séquences d'échappement de propriété
présentées.
Notez qu'ils ne sont disponibles que pour les expressions régulières compatibles Unicode
par l'indicateur /u
.
/\p{Number}/u.test('①'); // true
/\p{Alphabetic}/u.test('雪'); // true
L'inverse peut être mis en correspondance avec \P
.
/\P{Number}/u.test('①'); // false
/\P{Alphabetic}/u.test('雪'); // false
Le consortium Unicode définit de nombreuses autres propriétés, comme les symboles mathématiques. ou les caractères hiragana japonais:
/^\p{Math}+$/u.test('∛∞∉'); // true
/^\p{Script_Extensions=Hiragana}+$/u.test('ひらがな'); // true
La liste complète des classes de propriétés Unicode prises en charge est disponible dans la documentation proposition de spécifications. Pour découvrir d'autres exemples, consultez cet article informatif.
Assertions rétrospectives
Les assertions avant la date d'expiration font partie de la syntaxe d'expression régulière de JavaScript. dès le début. Leurs homologues, les assertions cachées, sont enfin présentées. Certains d'entre vous vous vous souvenez peut-être que cela fait déjà partie de V8 depuis un certain temps déjà. Nous avons même Utilisez l'assertion "lookbehind" en arrière-plan pour implémenter l'indicateur Unicode spécifié. en ES2015.
Le nom décrit déjà plutôt bien sa signification. Il permet de restreindre Un modèle à mettre en correspondance uniquement s'il est précédé par le modèle du groupe d'analyses postérieures. Il existe à la fois des types de correspondance et/ou qui ne correspondent pas:
/(?<=\$)\d+/.exec('$1 is worth about ¥123'); // ['1']
/(?<!\$)\d+/.exec('$1 is worth about ¥123'); // ['123']
Pour en savoir plus, consultez notre précédent article de blog. dédié aux assertions en arrière-plan, et des exemples dans des scénarios de test V8 associés.
Remerciements
Cet article de blog ne serait pas complet sans mentionner certaines des personnes qui ont travaillé sans relâche pour y parvenir, en particulier les champions de langue Mathias Bynens, Dan Ehrenberg, Claude Pache, Brian Terlson, Thomas Wood, Gorkem Yakin et Gorkem Yakin, expert d'Irregexp. Erik Corry; mais aussi tous ceux qui ont ont contribué aux spécifications linguistiques et à l'implémentation de ces caractéristiques.
Nous espérons que ces nouvelles fonctionnalités d'expression régulière vous plairont autant sont !