- いままで書いてきた正規表現リテラルの書き方(括弧の中身が出力される)
const text = 'abc(def)ghi';
const matchText = text.match(/\((.+)\)/);
console.log(matchText![1]);
//def
何が問題なのか??
正規表現リテラルを使うと変数で指定できない(もしかしたらできるかも)
- 試してみた例↓
const front = '(';
const end = ')';
const matchText = text.match('/\' + front + '(.+)\' + end '/');//できない
frontを前の括弧、endを後ろの括弧として指定してみたができなかった
RegExpを使ってみる
正規表現リテラルを使う以外にもRegExpというコンストラクタを使用する方法があるようだ
参照:https://www.wareko.jp/blog/typescript-which-is-better-regexp-or-regular-expression-literal
- 実際に書いてみる
const text = 'abc(def)ghi';
const left = '(';
const right = ')';
const regexp = new RegExp('\\' + left + '(.+)\\' + right);
const matchText = text.match(regexp)![1];
console.log(matchText);
//def
先ほど同様、frontを前の括弧、endを後ろの括弧として指定
regexpを変数としてRegExpコンストラクタを生成して、正規表現パターンを指定してあげるとうまく出力された!
注意点
注意点は主に2つ
1. 正規表現リテラルをそのままコンストラクタに入れない
const text = 'abc(def)ghi';
const left = '(';
const right = ')';
// const regexp = new RegExp('\\' + left + '(.+)\\' + right);
const regexp = new RegExp('/\' + left '(.+)\' + right '/');//エラー
5行目の正規表現リテラルで使用していた'/'はRegExpでは不要
2. \は2重にする必要あり
const regexp = new RegExp('\' + left + '(.+)\' + right);//これだと動かない
const regexp = new RegExp('\\' + left + '(.+)\\' + right);//これだと動く