4

私は JavaScript が初めてで、正規表現について質問があります。次のコードがあります。

var patt3=new RegExp(/(July|August)\s+\d{1,2}(\s|,)\d{4}/g);
var str3 = "August                               12,1988";
var match3 = str3.match(patt3);
document.write(match3.toString() + "<br/>");

出力は次のとおりです。 1988 年 8 月 12 日

以下は同じコードですが、RegExp の末尾から「g」が削除されています。

var patt3=new RegExp(/(July|August)\s+\d{1,2}(\s|,)\d{4}/);
var str3 = "August                               12,1988";
var match3 = str3.match(patt3);
document.write(match3.toString() + "<br/>");

出力は次のようになります: August 12,1988,August,,

Web で見つけた定義によると、「g」はすべてのパターンに一致するはずです。しかし、「g」がコードに与える影響については、まだちょっと混乱しています。

説明をいただければ幸いです。

前もって感謝します。

4

3 に答える 3

4

決定的な違いは、正規表現パターンがグローバルであるかどうかに関係なく、string.matchメソッドが異なる動作をするように定義されていることです。

パターンがグローバルの場合、すべてが一致する配列。あなたの場合、一致するものは1つだけですが、次のような例で違いを確認できます。

let matches = "aaaa".match(/a(a)/g); 
console.log(matches) // returns ["aa", "aa"]

ただし、パターンがグローバルでない場合、メソッドは最初に見つかった一致に対応する配列を返します。配列には、最初の位置に完全に一致した文字列が含まれ、他の位置にキャプチャが含まれます。キャプチャは、括弧で区切られた正規表現のビットです。ここでも、その例との違いを確認できます。

"aaaa".match(/a(a)/g); // returns ["aa", "a"]

最後に、コードに関するいくつかの小さな問題を指摘したいと思います。

まず、new Regexpここでコンストラクターを使用する必要はありません。正規表現リテラルを直接使用するだけです

var patt3 = /(July|August)\s+\d{1,2}(\s|,)\d{4}/g

第二に、やみくもに「toString」することはしないでください。あなたの場合、そのメソッドを配列に適用しているので、奇妙な結果が得られます。

最後に、デバッガーやconsole.logなどの開発ツールの使用方法を学びます。表現力と生産性の点で、document.writeとalertを悪用するよりもはるかに優れています。

console.write(match3)
于 2013-02-23T00:42:06.350 に答える
1

gパターン全体のすべてのオカレンスにのみ一致します。これは、PHPのようなグループのマッチングとは類似していませんpreg_match_all。がないg場合、パターン(matches[0])の最初の出現にのみ一致し、一致したすべてのグループは他の配列要素です。

ネストされた一致も取得したい場合は、JohnResigによって説明されている概念を使用して次のようにすることができます。

str3.replace(patt3, function () {
    //This is the first captured group in all matches iterated over
    console.log(arguments[1]);
});
于 2013-02-23T00:41:53.737 に答える