8

「JavaScript:The Good Parts」という本では、方法string.match(regexp)を次のように説明しています。

matchメソッドは、文字列と正規表現を照合します。これをどのように行うかは、gフラグによって異なります。gフラグがない場合、string .match(regexp)を呼び出した結果は、regexp .exec(string)を呼び出した結果と同じになります。ただし、正規表現にgフラグがある場合は、すべての一致の配列が生成されますが、キャプチャグループは除外されます。

次に、本はコード例を提供します:

var text = '<html><body bgcolor=linen><p>This is <b>bold<\/b>!<\/p><\/body><\/html>';
var tags = /[^<>]+|<(\/?)([A-Za-z]+)([^<>]*)>/g;
var a, i;
a = text.match(tags);
for (i = 0; i < a.length; i += 1) {
    document.writeln(('// [' + i + '] ' + a[i]).entityify());
}
// The result is
// [0] <html>
// [1] <body bgcolor=linen>
// [2] <p>
// [3] This is
// [4] <b>
// [5] bold
// [6] </b>
// [7] !
// [8] </p>
// [9] </body>
// [10] </html>

私の質問は、「キャプチャグループを除外する」ことは理解できないということです。

上記のコード例ではhtml</html>はキャプチャグループにあります。そして、なぜそれがまだ結果配列に含まれているのですか?

そして/、で</html>キャプチャグループにもあります。そして、なぜそれが結果配列に含まれるのですか?

上記のコード例で「キャプチャグループを除外する」と説明できますか?

どうもありがとうございます!

4

2 に答える 2

10

上記のコード例では、のhtmlはキャプチャグループに含まれています。そして、なぜそれがまだ結果配列に含まれているのですか?

完全一致だからです。彼が「キャプチャグループを除外する」と言った場合、完全一致の結果からではなく、キャプチャグループの内容が配列内で繰り返されていないことを意味します。キャプチャグループが含まれている場合は、

// The result is
// [0] <html>
// [1]           // From the capture group; nothing here
// [2] html      // From the capture group
// [3]           // From the capture group; nothing here
// ...

そして/はキャプチャグループにもあります。そして、なぜそれが結果配列に含まれるのですか?

上記と同じ理由で:それは全体的な試合の一部であり、それが結果に含まれています。個々のキャプチャグループの内容はそうではありません。

これは、より単純な例で理解しやすくなります。このコードを考えてみましょう:

var s = "test1 test2";
var re = /(test)(.)/g;
var r = s.match(re);
var i;
for (i = 0; i < r.length; ++i) {
    console.log("[" + i + "]: '" + r[i] + "'");
}

正規表現にはgフラグがあるため、完全一致のみが配列に含まれ、次のようになります。

[0]:'test1'
[1]:'test2'

いずれの場合も、配列のエントリは完全一致です。これには、式全体を構成するキャプチャグループ内で一致した文字が含まれます。

フラグを削除してgも他に何も変更しなかった場合、最初の完全一致が取得され、その後に2つのキャプチャグループのコンテンツが続きます。

[0]:'test1'//各キャプチャグループからのものを含む完全一致
[1]:'test'//グループ0のコンテンツをキャプチャします
[2]:'1'//グループ1のコンテンツをキャプチャします

そこでは、最初のエントリは完全一致です。次に、2番目と3番目はキャプチャグループの内容です。キャプチャグループの内容に注意してください

于 2012-06-05T16:48:35.170 に答える
0

g修飾子は、正規表現をグローバルに適用することです。これがないと、正規表現は一致し、最初に見つかった一致を返します。これを使用して、文字列内のすべての出現箇所を検索して照合します。

于 2012-06-05T16:45:48.393 に答える