5

これは不可能であるという答えを見つけるために夜を過ごした後、私は回避策を開発しました-しかし、誰かがより良い方法を知っているなら、私はそれを聞きたいです...

私はコードを何度も繰り返しましたが、以下は単なる考えにすぎません。ある時点で、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
4

1 に答える 1

4

.match()これは、JavaScriptでどのように機能するかではありません。返される配列は単純な文字列の配列です。キャプチャグループの「ネスト」はありません。(シンボルを左から右に数えるだけです。

(インデックスの[0])最初の文字列は、常に全体的に一致する文字列です。null次に、配列要素ごとに1つの文字列(または)のキャプチャグループが表示されます。

これまでと同様に、結果の配列を心ゆくまで再配置できます。それは単なる配列です。

編集—ああ、そしてあなたresult[1][0]が「g」だった理由は、文字列に適用された配列インデックス表記が文字列の個々の文字を取得するためです。

于 2012-08-09T15:55:04.943 に答える