typeof dla wyrażenia regularnego

Czy istnieje możliwość wykrycia, czy obiekt JavaScript jest wyrażeniem regularnym?

Na przykład, chciałbym zrobić coś takiego:

var t = /^foo(bar)?$/i;
alert(typeof t); //I want this to return "regexp"
Czy to możliwe? Dzięki!

EDIT: dzięki za wszystkie odpowiedzi. Wygląda na to, że mam dwa bardzo dobre wybory:

obj.constructor.name === "RegExp"

Lub

obj instanceof RegExp

Jakieś główne plusy / minusy obu metod?

Jeszcze raz dziękuję!

Author: Paul Sweatte, 2010-12-02

8 answers

Możesz użyć instanceof operator:

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

W rzeczywistości jest to prawie to samo co:

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

Należy pamiętać, że ponieważ Regex nie jest prymitywnym typem danych , nie jest możliwe użycie operatora typeof, który mógłby być najlepszą opcją dla tego pytania.

Ale możesz użyć tej sztuczki powyżej lub innych jak Typ kaczki sprawdzanie , na przykład Sprawdzanie, czy taki obiekt ma jakieś istotne metody lub Właściwości, lub przez jego wewnętrzna wartość klasy (przez użycie {}.toString.call(instaceOfMyObject)).

 151
Author: Cleiton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:35
alert( Object.prototype.toString.call( t ) ); // [object RegExp]

Jest to sposób opisany w specyfikacji dla uzyskania klasy obiektu.

Z ECMAScript 5, Sekcja 8.6.2 wewnętrzne właściwości i metody obiektu :

Wartość właściwości wewnętrznej [[Class]] jest zdefiniowana w niniejszej specyfikacji dla każdego rodzaju wbudowanego obiektu. Wartość [[Class]] wewnętrznej właściwości obiektu host może być dowolną wartością łańcuchową z wyjątkiem jednej z "Arguments", "Array", "Boolean", "Date", "Error", "Function", " JSON", "Math"," Number"," Object"," RegExp "i"String" . Wartość właściwości wewnętrznej [[Class]] jest używana wewnętrznie do rozróżniania różnego rodzaju obiektów. Zauważ, że ta specyfikacja nie zapewnia żadnych środków dla programu, aby uzyskać dostęp do tej wartości, z wyjątkiem obiektu.prototyp.toString (zob. 15.2.4.2).

RegExp jest klasą obiektu zdefiniowaną w specyfikacji w Sekcja 15.10 regexp (RegularExpression)Objects :

Obiekt RegExp zawiera zwykły wyrażenie i związane z nim flagi.

 22
Author: user113716,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-02 20:19:03

Podaj Właściwość .constructor wir:

> /^foo(bar)?$/i.constructor
function RegExp() { [native code] }
> /^foo(bar)?$/i.constructor.name
"RegExp"
> /^foo(bar)?$/i.constructor == RegExp
true
 11
Author: John Kugelman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-02 20:05:15

Z podkreślenia.js

// Is the given value a regular expression?
  _.isRegExp = function(obj) {
    return !!(obj && obj.test && obj.exec && (obj.ignoreCase || obj.ignoreCase === false));
  };
 10
Author: Sean Vieira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-02 20:05:23

Działa w google chrome:

x = /^foo(bar)?$/i;
x == RegExp(x); // true
y = "hello";
y == RegExp(y); // false
 3
Author: werehuman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-02 20:04:53

"Regexp" nie jest natywnym typem Javascript. Większość z powyższych odpowiedzi mówi ci, jak wykonać swoje zadanie, ale nie dlaczego. Oto Dlaczego .

 0
Author: Visionary Software Solutions,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-02 20:06:55

Nie ma absolutnego sposobu na sprawdzenie tego, na razie najlepszą odpowiedzią jest

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

Ale jest jedna strona w dół tego podejścia i to będzie zwracać false, jeśli obiekt wyrażenia regularnego pochodzi z innego okna.

 0
Author: Iman Mohamadi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-17 10:57:25

Są dwa sposoby:

/^\/.*\/$/.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 */

Jeśli literał jest oddzielany przez ogranicznik odwrotnego ukośnika wyrażeń regularnych, autotest wyrażeń regularnych zakończy się niepowodzeniem.

Jeśli Object.seal lub Object.freeze są uruchomione na obiekcie zdefiniowanym przez użytkownika, a ten obiekt ma również wszystkie wyżej wymienione właściwości, Instrukcja delete zwróci false positive.

Referencje

 0
Author: Paul Sweatte,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:47