169

このようなことは可能ですか?

var pattern = /some regex segment/ + /* comment here */
    /another segment/;

または、新しいRegExp()構文を使用して文字列を連結する必要がありますか? コードはより自明で簡潔であるため、リテラルを使用することをお勧めします。

4

12 に答える 12

210

正規表現リテラル構文を使用せずに正規表現を作成する方法を次に示します。これにより、正規表現オブジェクトになる前に、任意の文字列操作を行うことができます。

var segment_part = "some bit of the regexp";
var pattern = new RegExp("some regex segment" + /*comment here */
              segment_part + /* that was defined just now */
              "another segment");

2 つの正規表現リテラルがある場合、実際には次の手法を使用してそれらを連結できます。

var regex1 = /foo/g;
var regex2 = /bar/y;
var flags = (regex1.flags + regex2.flags).split("").sort().join("").replace(/(.)(?=.*\1)/g, "");
var regex3 = new RegExp(expression_one.source + expression_two.source, flags);
// regex3 is now /foobar/gy

式 1 と 2 をリテラル正規表現ではなくリテラル文字列にするよりも、より冗長です。

于 2008-10-09T00:54:14.067 に答える
20

「eval」オプションにはまったく同意しません。

var xxx = /abcd/;
var yyy = /efgh/;
var zzz = new RegExp(eval(xxx)+eval(yyy));

意図した結果ではない「//abcd//efgh//」を返します。

ソースのような使用

var zzz = new RegExp(xxx.source+yyy.source);

「/abcdefgh/」が返されますが、それは正しいです。

論理的には評価する必要はありません。あなたはあなたの表現を知っています。そのソースまたはそれがどのように記述されているかだけが必要であり、必ずしもその値は必要ありません。フラグに関しては、RegExp のオプションの引数を使用するだけです。

私の状況では、連結しようとしているいくつかの式で ^ と $ が使用されているという問題が発生します。これらの式は、プログラム全体で使用される文法フィルターです。ここで、それらのいくつかを一緒に使用して PREPOSITIONS のケースを処理したくありません。ソースを「スライス」して、開始と終了の ^( および/または )$ を削除する必要がある場合があります:)乾杯、アレックス。

于 2010-01-14T16:17:32.017 に答える
3

できるだけ頻繁にリテラル構文を使用することをお勧めします。より短く、より読みやすく、エスケープ引用符や二重エスケープ バックラッシュは必要ありません。「Javascript パターン」より、Stoyan Stefanov 2010.

ただし、 New を使用することが連結する唯一の方法である場合があります。

私は評価を避けます。安全ではありません。

于 2012-07-25T01:52:52.677 に答える
1

いいえ、文字通りの方法はサポートされていません。RegExp を使用する必要があります。

于 2008-10-09T01:00:18.000 に答える
-3

両端に追加しeval('your expression')ないため、使用することを好みます。//='new RegExp'

于 2009-04-15T15:12:18.587 に答える