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ę!
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)
).
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.
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
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
// Is the given value a regular expression?
_.isRegExp = function(obj) {
return !!(obj && obj.test && obj.exec && (obj.ignoreCase || obj.ignoreCase === false));
};
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
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 .
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.
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
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