172

JavaScriptオブジェクトが正規表現であるかどうかを検出する方法はありますか?

たとえば、次のようなことをしたいと思います。

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

これは可能ですか?

ありがとう!

編集:すべての回答をありがとう。私には2つの非常に良い選択肢があるようです:

obj.constructor.name === "RegExp"

また

obj instanceof RegExp

どちらの方法にも主な長所/短所はありますか?

再度、感謝します!

4

9 に答える 9

234

instanceof演算子を使用できます。

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

実際、それは次のものとほとんど同じです。

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

RegExpプリミティブ データ型ではないため、この質問に最適なオプションtypeofである演算子を使用することはできないことに注意してください。

ただし、上記のトリックや、ダック型チェックのような他のトリックを使用できます。たとえば、そのようなオブジェクトに重要なメソッドやプロパティがあるかどうか、またはその内部クラス値によって ( を使用して{}.toString.call(instaceOfMyObject)) チェックします。

于 2010-12-02T20:08:59.517 に答える
24
alert( Object.prototype.toString.call( t ) ); // [object RegExp]

これは、オブジェクトのクラスを取得するための仕様で言及されている方法です。

ECMAScript 5から、セクション 8.6.2 オブジェクトの内部プロパティとメソッド:

[[Class]] 内部プロパティの値は、組み込みオブジェクトの種類ごとにこの仕様によって定義されます。ホスト オブジェクトの [[Class]] 内部プロパティの値は、 "Arguments"、"Array"、"Boolean"、"Date"、"Error"、"Function"、"JSON"のいずれかを除く任意の文字列値である可能性があります。 、「Math」、「Number」、「Object」、「RegExp」、および「String」。[[Class]] 内部プロパティの値は、さまざまな種類のオブジェクトを区別するために内部的に使用されます。この仕様は、Object.prototype.toString (15.2.4.2 を参照) を介する場合を除いて、プログラムがその値にアクセスする手段を提供しないことに注意してください。

RegExp は、セクション 15.10 RegExp(RegularExpression)Objectsの仕様で定義されているオブジェクトのクラスです。

RegExp オブジェクトには、正規表現と関連するフラグが含まれています。

于 2010-12-02T20:13:20.577 に答える
14

プロパティ.constructorに旋風を巻き起こします:

> /^foo(bar)?$/i.constructor
function RegExp() { [native code] }
> /^foo(bar)?$/i.constructor.name
"RegExp"
> /^foo(bar)?$/i.constructor == RegExp
true
于 2010-12-02T20:05:15.463 に答える
10

underscore.jsから

// Is the given value a regular expression?
  _.isRegExp = function(obj) {
    return !!(obj && obj.test && obj.exec && (obj.ignoreCase || obj.ignoreCase === false));
  };
于 2010-12-02T20:05:23.360 に答える
3

Google Chrome で動作します:

x = /^foo(bar)?$/i;
x == RegExp(x); // true
y = "hello";
y == RegExp(y); // false
于 2010-12-02T20:04:53.877 に答える
0

これを確認する絶対的な方法はありません。これまでのところ、最良の答えは

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

ただし、このアプローチには欠点が 1 つあります。それは、正規表現オブジェクトが他のウィンドウからのものである場合に false を返すことです。

于 2013-10-17T10:57:25.610 に答える
0

「Regexp」はネイティブの Javascript タイプではありません。上記の回答のほとんどは、タスクを達成する方法を示していますが、その理由は示していません。理由は次のとおりです。

于 2010-12-02T20:06:55.467 に答える