正規表現には、文字列の先頭と末尾に一致するアンカーがあるため、複数の出現に一致するだけでは不十分です。String.match
RegExpg
フラグ (グローバル修飾子)を使用して更新されたコード:
var userIn = 'Cu(NO3)2(CO2)3';
var inPar = userIn.match(/\([^)]*\)/g).map(function(s){ return s.substr(1); });
inPar; //["NO3)", "CO2)"]
古い IE サポートが必要な場合: Array.prototype.map
polyfill
またはポリフィルなし:
var userIn = 'Cu(NO3)2(CO2)3';
var inPar = [];
userIn.replace(/\(([^)]*\))/g, function(s, m) { inPar.push(m); });
inPar; //["NO3)", "CO2)"]
上記は a に一致し、(
0 個以上の非)
文字のシーケンスをキャプチャし、その後に a が続き、)
それを配列にプッシュしinPar
ます。
(
最初の正規表現は本質的に同じことを行いますが、キャプチャ グループの代わりに左括弧 (後で配列をマッピングすることによって削除されます)を含む一致全体を使用します。
質問から、閉じ括弧が結果の文字列にあると予想されると仮定し)
ます。それ以外の場合は、閉じ括弧のない更新されたソリューションを次に示します。
最初のソリューションの場合 (を使用s.slice(1, -1)
):
var inPar = userIn.match(/\([^)]*\)/g).map(function(s){ return s.slice(1, -1);});
2 番目のソリューション (\)
キャプチャ グループの外側) の場合:
userIn.replace(/\(([^)]*)\)/g, function(s, m) { inPar.push(m); });