typeof pour les RegExp

y a-t-il de toute façon pour 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

Toute les principaux avantages/inconvénients de chaque méthode?

Merci encore!

113
demandé sur Paul Sweatte 2010-12-02 23:01:06

8 réponses

Vous pouvez utiliser instanceof opérateur:

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

en fait, c'est-à-dire presque le même que:

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

gardez à l'esprit que comme Regex n'est pas un type de données primitives , il n'est pas possible d'utiliser typeof opérateur qui pourrait être la meilleure option pour cette question.

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

151
répondu Cleiton 2017-05-23 10:31:35
alert( Object.prototype.toString.call( t ) ); // [object RegExp]

c'est la façon mentionnée dans la spécification pour obtenir la classe de l'objet.

à Partir de ECMAScript 5, de l'Article 8.6.2 de l'Objet Interne Propriétés et Méthodes :

la valeur de La [[Catégorie]] propriété interne est défini par cette spécification pour chaque type d'objet intégré. La valeur de la propriété interne [[Class]] d'un objet hôte peut être n'importe quelle valeur de chaîne de caractères sauf une valeur de "Arguments", "Tableau", "Boolean", "Date", "Erreur", "Fonction", "JSON", "Mathématiques", "Nombre", "Objet", "RegExp", et la "Chaîne de caractères" . La valeur d'une [[classe]] propriété interne est utilisée à l'interne pour distinguer différents types d'objets. Notez que cette spécification ne fournit aucun moyen pour un programme d'accéder à cette valeur sauf par objet.prototype.toString (voir 15.2.4.2).

un RegExp est une classe d'objet définie dans la spécification Section 15.10 RegExp(RegularExpression)Objets :

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

22
répondu user113716 2010-12-02 20:19:03

Donner .constructor la propriété d'un bain:

> /^foo(bar)?$/i.constructor
function RegExp() { [native code] }
> /^foo(bar)?$/i.constructor.name
"RegExp"
> /^foo(bar)?$/i.constructor == RegExp
true
11
répondu John Kugelman 2010-12-02 20:05:15

à Partir de trait de soulignement.js

// Is the given value a regular expression?
  _.isRegExp = function(obj) {
    return !!(obj && obj.test && obj.exec && (obj.ignoreCase || obj.ignoreCase === false));
  };
10
répondu Sean Vieira 2010-12-02 20:05:23

Travaille dans google chrome:

x = /^foo(bar)?$/i;
x == RegExp(x); // true
y = "hello";
y == RegExp(y); // false
3
répondu werehuman 2010-12-02 20:04:53

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

0
répondu Visionary Software Solutions 2010-12-02 20:06:55

il n'y a aucun moyen absolu 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 côté vers le bas à cette approche et c'est qu'elle retournera false si l'objet d'expression régulière est commeing d'une autre fenêtre.

0
répondu Iman Mohamadi 2013-10-17 10:57:25

il y a 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 une chaîne littérale est délimitée par le délimiteur regexp backslash, le test regexp self échouera.

si Object.seal ou Object.freeze sont exécutés sur un objet défini par l'utilisateur, et que cet objet possède également toutes les propriétés susmentionnées, la déclaration delete retournera un faux positif.

Références

0
répondu Paul Sweatte 2017-05-23 12:02:47