状況
- 配列の中から特定の文字列が含まれた要素を抽出したい.
- 「特定の文字列」は複数あるので,変数や配列を用いて定義したものを使用したい.
- そもそも複数条件の文字列で抽出するのはどうすればよいのか...
データ例(適当)
const array = [
{
name: 'hoge',
message: 'aaaaa',
},
{
name: 'fuga',
message: 'bbbbb',
},
{
name: 'hoge',
message: 'ccccc',
},
{
name: 'fuga',
message: 'ddddd',
},
{
name: 'hoge',
message: 'eeeee',
},
{
name: 'hoge',
message: 'fffff',
},
{
name: 'piyo',
message: 'ggggg',
},
];
ここから特定の文字列が含まれたメッセージだけを抽出したい!
解決策
- まず,特定の文字列複数条件(今回は
aa
またはbb
)で抽出をしてみる. match()
の引数に正規表現を記述する./
間に正規表現を記述すれば OK.- 複数条件は
|
を使用して OR 条件を設定する. ()
の位置でハマった.「任意文字列(複数文字列条件)任意文字列」にしないといけない.
const abArray = array.filter(x => x.message.match(/.*(aa|bb).*/));
console.log(abArray);
実行結果
(2) [{…}, {…}]
0: {name: "hoge", message: "aaaaa"}
1: {name: "fuga", message: "bbbbb"}
length: 2
- 続いて,配列に条件文字列を入れて適用する.
- 変数や配列の場合は「/hogehoge/」では動作しないので,RegExp オブジェクトを定義する必要がある(
new RegExp()
の部分). - RegExp オブジェクトを使用する場合,引数に文字列形式で正規表現を記述すれば OK.
- 今回は配列で検索文字列を定義しているため,OR 条件にするには
join()
を用いて|
区切りの文字列に変換した.
const targetArray = ['c','f','g'];
const regExp = new RegExp(`.*(${targetArray.join('|')}).*`);
const cfgArray = array.filter(x => x.message.match(regExp));
console.log(cfgArray);
実行結果
(3) [{…}, {…}, {…}]
0: {name: "hoge", message: "ccccc"}
1: {name: "hoge", message: "fffff"}
2: {name: "piyo", message: "ggggg"}
length: 3
まとめ
- 正規表現を用いて複数条件検索(OR 条件)を行うときは
|
で区切る.()
の位置に注意. - 変数や配列を用いるときは RegExp オブジェクトを使用する必要がある.
- 複数条件の場合は
|
区切りの文字列形式に直せば OK.
以上だ( `・ω・)b