2009-05-19 8 views
47

J'ai une situation où je veux obtenir une expression rationnelle de l'utilisateur et l'exécuter contre quelques milliers de chaînes d'entrée. Dans le manuel, j'ai trouvé que l'objet RegExp a une méthode .compile() qui est utilisée pour accélérer les choses dans de tels cas. Mais pourquoi dois-je passer à nouveau la chaîne regexp si je les ai déjà passés dans le constructeur? Peut-être constructeur fait le compile() lui-même?Javascript: quel est le point de RegExp.compile()?

Répondre

83

RegExp().compile() method is deprecated. C'est fondamentalement le même que le constructeur, ce qui je suppose est pourquoi il était obsolète. Vous devriez seulement utiliser le constructeur de nos jours.

En d'autres termes, vous avez utilisé pour être en mesure de le faire:

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

Mais de nos jours, il est pas différent d'appeler simplement:

var regexp = new RegExp("pattern"); 
regexp = new RegExp("new pattern"); 
3

Pour autant que je peux dire à tous RegExp .compile est remplace l'expression régulière sous-jacente d'un objet RegExp. Je pense que la compilation a pu avoir de la valeur dans le passé, mais tous les moteurs JS modernes "compilent" la regex lors du premier appel et mettent en cache cette version "compilée".

+1

Quels moteurs font exactement les expressions régulières de cache? Et le font-ils toujours? Combien de temps une expression est-elle conservée dans le cache? Je suis particulièrement intéressé par le V8. – CoDEmanX

6

Et avec Opera 11, l'exécution de RegExp.compile() provoquera réellement des erreurs. De toute évidence, quand Opera "compile" une regex, il encapsule la chaîne re.source dans les barres obliques (par exemple, re.source == "^(.)" devient "/^(.)/"). Si vous compilez manuellement l'expression régulière, Opera ne reconnaît pas ce fait et va de l'avant et le compile à nouveau (re.source devient "//^(.)//"). Chaque compilation génère un ensemble supplémentaire de barres obliques qui modifie la signification de l'expression régulière et génère des erreurs.

2

Vous devez compiler votre regex premier à 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"))

+2

Wow, c'est intéressant. Je viens de vérifier, et vous avez raison! Ce n'est pas mentionné dans MDN cependant. –

+2

Voir cette explication: http://stackoverflow.com/a/7964948/651789 – ken

Questions connexes