17

これは存在しますか?

次のような文字列を解析する必要があります。

the dog from the tree

そして、次のようなものを取得します

[[null, "the dog"], ["from", "the tree"]]

これは、Ruby で 1 つの RegExp とString#scan.

JavaScriptString#matchはこれを処理できません。キャプチャ グループではなく、RegExp が一致したものを返すだけなので、次のようなものを返します。

["the dog", "from the tree"]

Ruby アプリケーションで何度も使用したためString#scan、この動作を JavaScript ポートで簡単に再現できる方法があればいいのにと思います。

編集: これが私が使用している正規表現です: http://pastebin.com/bncXtgYA

4

3 に答える 3

14
String.prototype.scan = function (re) {
    if (!re.global) throw "ducks";
    var s = this;
    var m, r = [];
    while (m = re.exec(s)) {
        m.shift();
        r.push(m);
    }
    return r;
};
于 2012-12-15T19:32:37.430 に答える
5

を使用した別の実装を次に示しString.replaceます。

String.prototype.scan = function(regex) {
    if (!regex.global) throw "regex must have 'global' flag set";
    var r = []
    this.replace(regex, function() {
        r.push(Array.prototype.slice.call(arguments, 1, -2));
    });
    return r;
}

仕組み:replace一致ごとにコールバックを呼び出し、一致した部分文字列、一致したグループ、オフセット、および完全な文字列を渡します。一致したグループのみが必要なのでslice、他の引数を除外します。

于 2012-12-15T20:22:37.133 に答える