1

次のように機能する機能はありますか?

var regex=/\s*(\w+)/;
var s="abc def ";
var m1=regex.exec(s,0); // -> matches "abc"
var m2=regex.exec(s,3); // -> matches "def"

私は代替案が次のとおりであることを知っています:

var regex=/\s*(\w+)/;
var s="abc def ";
var m1=regex.exec(s); // -> matches "abc"
var m2=regex.exec(s.substring(3)); // -> matches " def"

しかし、sが非常に長く、s.substringが何度も呼び出されると、長い文字列を何度もコピーするという実装の効率が悪くなる可能性があるのではないかと心配しています。

4

2 に答える 2

4

はい、正規表現にグローバル修飾子execがある場合は、特定のインデックスから開始できます。g

var regex=/\s*(\w+)/g; // give it the "g" modifier

regex.lastIndex = 3;   // set the .lastIndex property to the starting index

var s="abc def ";

var m2=regex.exec(s); // -> matches "def"

最初のコード例にg修飾子が含まれている場合、上記とまったく同じ理由で、記述したとおりに機能します。を使用すると、最後の一致が終了した後のインデックスgに自動的に設定されるため、次の呼び出しはそこで開始されます。.lastIndex

だからそれはあなたが必要とするものに依存します。

一致するものがいくつあるかわからない場合、一般的なアプローチはexecループで実行することです。

var match,
    regex = /\s*(\w+)/g,
    s = "abc def ";

while(match = regex.exec(s)) {
    alert(match);
}

またはとしてdo-while

var match,
    regex = /\s*(\w+)/g,
    s = "abc def ";

do {
    match = regex.exec(s);
    if (match)
        alert(match);
} while(match);
于 2012-09-10T15:01:36.907 に答える