この回答で使用される用語:
- 一致は、次のように文字列に対してRegExパターンを実行した結果を示します
someString.match(regexPattern)
。
- 整合パターンは入力文字列の一致するすべての部分、内部のすべての存在を示すマッチアレイ。これらはすべて、入力文字列内のパターンのインスタンスです。
- 一致したグループは、RegExパターンで定義された、キャッチするすべてのグループを示します。(括弧内のパターンは、次のようになります:
/format_(.*?)/g
。ここ(.*?)
で、一致したグループになります。)これらは、一致したパターン内にあります。
説明
アクセスを取得するにはマッチしたグループを、それぞれにマッチしたパターンは、関数または反復処理するために似たような必要な試合を。他の多くの回答が示すように、これを行うにはいくつかの方法があります。他のほとんどの回答では、whileループを使用してすべての一致したパターンを反復処理しますが、そのアプローチの潜在的な危険性は誰もが知っていると思います。new RegExp()
コメントでのみ言及されたパターンそのものではなく、と照合する必要があります。これは、ある.exec()
方法がに似て振る舞うジェネレータ関数 - それは試合があるたびに停止しますが、そのを保つ.lastIndex
の次に、そこから継続する.exec()
コール。
コード例
以下は、すべての一致したパターンのsearchString
を返す関数の例です。各パターンは、すべての一致したグループを含むです。whileループを使用する代わりに、関数と、より単純なループを使用したよりパフォーマンスの高い方法の両方を使用した例を示しました。Array
match
Array
Array.prototype.map()
for
簡潔なバージョン(より少ないコード、より多くの構文糖)
これらは基本的forEach
に、より高速なfor
-loopの代わりに-loopを実装するため、パフォーマンスが低下します。
// Concise ES6/ES2015 syntax
const searchString =
(string, pattern) =>
string
.match(new RegExp(pattern.source, pattern.flags))
.map(match =>
new RegExp(pattern.source, pattern.flags)
.exec(match));
// Or if you will, with ES5 syntax
function searchString(string, pattern) {
return string
.match(new RegExp(pattern.source, pattern.flags))
.map(match =>
new RegExp(pattern.source, pattern.flags)
.exec(match));
}
let string = "something format_abc",
pattern = /(?:^|\s)format_(.*?)(?:\s|$)/;
let result = searchString(string, pattern);
// [[" format_abc", "abc"], null]
// The trailing `null` disappears if you add the `global` flag
高性能バージョン(より多くのコード、より少ない構文糖)
// Performant ES6/ES2015 syntax
const searchString = (string, pattern) => {
let result = [];
const matches = string.match(new RegExp(pattern.source, pattern.flags));
for (let i = 0; i < matches.length; i++) {
result.push(new RegExp(pattern.source, pattern.flags).exec(matches[i]));
}
return result;
};
// Same thing, but with ES5 syntax
function searchString(string, pattern) {
var result = [];
var matches = string.match(new RegExp(pattern.source, pattern.flags));
for (var i = 0; i < matches.length; i++) {
result.push(new RegExp(pattern.source, pattern.flags).exec(matches[i]));
}
return result;
}
let string = "something format_abc",
pattern = /(?:^|\s)format_(.*?)(?:\s|$)/;
let result = searchString(string, pattern);
// [[" format_abc", "abc"], null]
// The trailing `null` disappears if you add the `global` flag
これらの選択肢を他の回答で以前に述べたものと比較する必要はありませんが、この方法は他の方法よりもパフォーマンスとフェイルセーフが低いと思います。