web-dev-qa-db-fra.com

JavaScript: Quel est le point de Regexp.comPile ()?

J'ai une situation où je veux obtenir une réégycade de l'utilisateur et le gérer pendant quelques milliers de chaînes de saisie. Dans le manuel, j'ai constaté que l'objet RegExp a une méthode .compile() utilisée pour accélérer les choses conformes de tels cas. Mais pourquoi dois-je passer la chaîne Regexp à nouveau si je les ai déjà transmises dans le constructeur? Peut-être constructeur fait-il la compile() elle-même?

50
Vilx-

La méthode RegExp().compile() est obsolète . C'est fondamentalement la même chose que le constructeur, que je suppose, c'est pourquoi il a été obsolète. Vous devez seulement avoir à utiliser le constructeur de nos jours.

En d'autres termes, vous aviez l'habitude de le faire:

var regexp = new RegExp("pattern");
regexp.compile("new pattern");

Mais de nos jours, ce n'est pas différent de simplement appeler:

var regexp = new RegExp("pattern");
regexp = new RegExp("new pattern");
87
Daniel Lew

Et avec Opera 11, exécutant RegExp.compile() provoquera réellement des erreurs.

Évidemment, lorsque =Opera "compile" une regex, il enveloppe la chaîne re.source String dans les barres obliques (par exemple, re.source == "^(.)" devient "/^(.)/" ). Si vous compilez manuellement la regex, Opera ne reconnaît pas ce fait et va de l'avant et la compilez à nouveau (re.source devient "//^(.)//"). Chaque compilation aboutit à un ensemble supplémentaire de barres obliques avant, ce qui modifie la signification de l'expression régulière et des résultats dans les erreurs.

6
ridgerunner

Vous devez d'abord compiler votre regex pour l'utiliser si vous utilisez /, essayez ceci:

var regex=new RegExp('/[a-zA-Z]/')

console.log("not compiled with escape /", regex.test("ciao") )

regex.compile()

console.log("compiled", regex.test("ciao") )

var regex=new RegExp('[a-zA-Z]')

console.log("not compiled, but no escape /", regex.test("ciao") )
4
loretoparisi

Pour autant que je puisse dire que tout Regexp.compile remplace l'expression régulière sous-jacente d'un objet Regexp. Je pense que compiler peut avoir de la valeur dans le passé, mais tous les moteurs JS modernes "compilent" la regex sur le premier appel et la cache de la version "compilée".

3
olliej