次の正規表現があるとします。
var myregex = /^(i|blah|ho)$/
私は別の変数を持っています:
var list = ["some","another"]
リスト内の単語をsomeregexに追加して、「myregex」の結果が次のようになるようにするにはどうすればよいですか。
var myregex = /^(i|blah|ho|some|another)$/
次の正規表現があるとします。
var myregex = /^(i|blah|ho)$/
私は別の変数を持っています:
var list = ["some","another"]
リスト内の単語をsomeregexに追加して、「myregex」の結果が次のようになるようにするにはどうすればよいですか。
var myregex = /^(i|blah|ho|some|another)$/
元の単語リストから始めて問題に取り組む別の方法を見つけようとする傾向がありますが、実際に既存の単語リストに追加する必要がある場合、正規表現インスタンスには、式のソースを文字列として返すsource
プロパティがあり、文字列を受け入れるコンストラクター。だからあなたはこれを行うことができます:
var rex = /^(i|blah|ho)$/;
var list = ["some","another"];
rex = new RegExp(rex.source.replace(")$", "|" + list.join("|") + ")$");
これによりフラグが失われるため、RegExp
コンストラクターの2番目の引数を使用して、元の正規表現の、、、などのプロパティに基づい"gi"
て、または任意の文字列を作成global
することをお勧めします。(または、そのためのハックは、返される文字列の最後に続く文字を使用して取得し、それらを2番目の引数として提供することです。)したがって、上記のより完全なバージョンは次のようになります。ignoreCase
multiline
rex.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
これを行うには 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);
どちらが速いかわかりません。