1

次の正規表現があるとします。

var myregex = /^(i|blah|ho)$/

私は別の変数を持っています:

var list = ["some","another"]

リスト内の単語をsomeregexに追加して、「myregex」の結果が次のようになるようにするにはどうすればよいですか。

var myregex = /^(i|blah|ho|some|another)$/
4

2 に答える 2

4

元の単語リストから始めて問題に取り組む別の方法を見つけようとする傾向がありますが、実際に既存の単語リストに追加する必要がある場合、正規表現インスタンスには、式のソースを文字列として返すsourceプロパティがあり、文字列を受け入れるコンストラクター。だからあなたはこれを行うことができます:

var rex = /^(i|blah|ho)$/;
var list = ["some","another"];
rex = new RegExp(rex.source.replace(")$", "|" + list.join("|") + ")$");

これによりフラグが失われるため、RegExpコンストラクターの2番目の引数を使用して、元の正規表現の、、、などのプロパティに基づい"gi"て、または任意の文字列を作成globalすることをお勧めします。(または、そのためのハックは、返される文字列の最後に続く文字を使用して取得し、それらを2番目の引数として提供することです。)したがって、上記のより完全なバージョンは次のようになります。ignoreCasemultilinerex.toString()/

// (I added a flag to this one to check that the flags processing worked)
var rex = /^(i|blah|ho)$/i;
var list = ["some","another"];
var flags = rex.toString();
var index = flags.lastIndexOf("/");
flags = flags.substring(index + 1);
rex = new RegExp(rex.source.replace(")$", "|" + list.join("|") + ")$"), flags);

実例| ソース

また、単語に正規表現( .、、、、など)に固有の文字が含まれている場合、上記は機能しなくなることに注意してください。英数字は問題ありません。そうでない場合は、実際に使用されているさまざまな実装の1つを使用して(残念ながら標準にはありません)、それを使用して個々の単語をエスケープすることをお勧めします。\/$RegExp.escape

于 2013-01-13T06:46:25.497 に答える
0

これを行うには 2 つの方法があります。

1.) 配列連結を介して

var myregex = /^(i|blah|ho)$/;
var list = ["some","another"];

var _newList = myregex.toString().match(/([a-z]+)/gi).concat(list);

var myNewRegEx = new RegExp("/^(" + _newList.join('|') + ")$/");

2.) 正規表現の置換を介して

var myregex = /^(i|blah|ho)$/;
var list = ["some","another"];

var _t = myregex.toString().replace(/\)/, '|' + list.join('|') + ')' );
var myNewRegEx = new RegExp(_t);

どちらが速いかわかりません。

于 2013-01-13T07:15:38.223 に答える