これは不可能であるという答えを見つけるために夜を過ごした後、私は回避策を開発しました-しかし、誰かがより良い方法を知っているなら、私はそれを聞きたいです...
私はコードを何度も繰り返しましたが、以下は単なる考えにすぎません。ある時点で、match() が機能するためにグローバル フラグを使用していたと思いますが、それが今必要であったかどうかは思い出せません。
var str = "@abc@def@ghi&jkl";
var regex = /^(?:@([a-z]+))?(?:&([a-z]+))?$/;
この簡略化されたコードのアイデアは、オプションのグループ 1 であり、量が指定されておらず、@abc、@def、および @ghi に一致します。1 つまたは複数のアルファベット文字のみがキャプチャされます。グループ 2 は、& 記号の一致を除いて同じです。また、文字列の最初と最後に固定する必要があります。
両方のグループのすべての一致を後方参照できるようにしたい、つまり:
result = str.match(regex);
alert(result[1]); //abc,def,ghi
alert(result[1][0]); //abc
alert(result[1][1]); //def
alert(result[1][2]); //ghi
alert(result[2]); //jkl
私の仲間は、これが .net でうまく機能すると言っています。
(さらに、どちらかのグループをオプションにすることは、グローバル フラグを設定する場合と同様に混乱を招きます)
var str = "@abc@def@ghi&jkl";
var regex = /(?:@([a-z]+))(?:&([a-z]+))/;
var result = str.match(regex);
alert(result[1]); //ghi
alert(result[1][0]); //g
alert(result[2]); //jkl
以下は、問題の部分全体をキャプチャし、自分で配列を作成して、私がたどり着いた解決策です。
var str = "@abc@def@ghi&jkl";
var regex = /^([@a-z]+)?(?:&([a-z]+))?$/;
var result = regex.exec(str);
alert(result[1]); //@abc@def@ghi
alert(result[2]); //jkl
var result1 = result[1].toString();
result[1] = result1.split('@')
alert(result[1][1]); //abc
alert(result[1][2]); //def
alert(result[1][3]); //ghi
alert(result[2]); //jkl