Question

Y at-il de toute façon à détecter si un objet JavaScript est un regex?

Par exemple, je voudrais faire quelque chose comme ceci:

var t = /^foo(bar)?$/i;
alert(typeof t); //I want this to return "regexp"

Est-ce possible?

Merci!

EDIT: Merci pour toutes les réponses. Il semble que j'ai deux très bons choix:

obj.constructor.name === "RegExp"

ou

obj instanceof RegExp

Les principaux avantages / inconvénients de ces deux méthodes?

Merci encore!

Était-ce utile?

La solution

Vous pouvez utiliser instanceof opérateur:

var t = /^foo(bar)?$/i;
alert(t instanceof RegExp);//returns true

En fait, qui est presque la même chose que:

var t = /^foo(bar)?$/i;
alert(t.constructor == RegExp);//returns true

Gardez à l'esprit que RegExp est pas type de données primitif , il est impossible d'utiliser l'opérateur de typeof qui pourrait la meilleure option pour cette question.

Mais vous pouvez utiliser cette astuce ci-dessus ou d'autres comme vérification de type canard , par exemple, vérifier si cet objet a des méthodes ou des propriétés vitales, ou par son valeur de classe interne (en utilisant {}.toString.call(instaceOfMyObject)).

Autres conseils

alert( Object.prototype.toString.call( t ) ); // [object RegExp]

Ceci est la manière indiquée dans le cahier des charges pour obtenir la classe d'objet.

De ECMAScript 5, Section 8.6.2 Propriétés internes Objet et méthodes :

  

La valeur de la [[classe]] propriété interne est définie par cette spécification pour tous les types de haut-objet. La valeur de la [[classe]] propriété interne d'un objet hôte peut être une valeur de chaîne, sauf un « Arguments », « Array », « Boolean », « Date », « Erreur », « Fonction », "JSON", "Math", "Number", "objet", "RegExp" et "String" . La valeur d'une [[classe]] propriété interne est utilisé en interne pour distinguer les différents types d'objets. Notez que cette spécification ne fournit aucun moyen pour un programme d'accès que la valeur que par Object.prototype.toString (voir 15.2.4.2).

A RegExp est une classe d'objet défini dans la spécification à Section 15.10 RegExp (RegularExpression) Objets :

  

Un objet RegExp contient une expression régulière et les drapeaux associés.

Donner la propriété .constructor un tourbillon:

> /^foo(bar)?$/i.constructor
function RegExp() { [native code] }
> /^foo(bar)?$/i.constructor.name
"RegExp"
> /^foo(bar)?$/i.constructor == RegExp
true

De underscore.js

// Is the given value a regular expression?
  _.isRegExp = function(obj) {
    return !!(obj && obj.test && obj.exec && (obj.ignoreCase || obj.ignoreCase === false));
  };

Travaux dans google chrome:

x = /^foo(bar)?$/i;
x == RegExp(x); // true
y = "hello";
y == RegExp(y); // false

"Regexp" est pas un type Javascript natif. La plupart des réponses ci-dessus vous dire comment accomplir votre tâche, mais pas pourquoi. Voici pourquoi .

Il n'y a pas de façon absolue de vérifier cela, jusqu'à présent la meilleure réponse est

var t = /^foo(bar)?$/i;
alert(t instanceof RegExp);//returns true

mais il y a un inconvénient à cette approche et qui est elle retournera false si l'objet régulier d'expression est commeing d'une autre fenêtre.

Voici deux façons:

/^\/.*\/$/.test(/hi/) /* test regexp literal via regexp literal */
/^\/.*\/$/.test(RegExp("hi") ) /* test RegExp constructor via regexp literal */
RegExp("^/" + ".*" + "/$").test(/hi/) /* test regexp literal via RegExp constructor */
RegExp("^/" + ".*" + "/$").test(RegExp("hi") ) /* test RegExp constructor via RegExp constructor */ 

delete RegExp("hi").source /* test via deletion of the source property */
delete /hi/.global /* test via deletion of the global property */
delete /hi/.ignoreCase /* test via deletion of the ignoreCase property */
delete RegExp("hi").multiline /* test via deletion of the multiline property */
delete RegExp("hi").lastIndex /* test via deletion of the lastIndex property */

Si un littéral de chaîne est délimitée par le séparateur backslash regexp, l'auto-test regexp échouera.

Si Object.seal ou Object.freeze sont exécutés sur un objet défini par l'utilisateur, et cet objet a également toutes les propriétés mentionnées ci-dessus, l'instruction delete renverra un faux positif.

Références

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top