2

これをコンテキストに入れるために、次の2つの関数を検討してください。

ml_RestrictToChars = function(input,regex) {
    var result = '';var c = '';
    var rx = new RegExp(regex);
    for (var i = 0; i < input.length; i++) {
        c = input.charAt(i);
        if (rx.test(c)) {
            result += c;
        }
    }
    return result;
};
ml_OmitChars = function(input,regex) {
    var rx = new RegExp(regex,'g');
    return input.replace(rx,''); 
};

最初の関数は入力を特定の文字セットに制限し、2番目の関数は入力から任意の文字または文字のシーケンスを省略します。最初の関数のコードからわかるように、インクルージョンコードは一度に1文字しかチェックしないため、単一の文字クラスが'regex'引数に渡された場合にのみ機能します。

入力文字列について考えてみましょう。12-34今、の正規表現を'[0-9]'最初の関数と'[^0-9]'2番目の関数に渡すと、期待どおりに同じ出力が得られます。1234

ただし、2番目の関数でより高度な式を使用すると、の'[^0-9][^0-9]-'出力が得られます12-。ただし、最初の関数に複数の文字クラスを渡すと、空の文字列が返されます。

私が疑問に思っているのは、ml_OmitCharsの逆を実行して、同じように機能する簡単な方法(できればループなし)があるかどうかです。

4

1 に答える 1

1

すべての文字を一致させるのは簡単ですが (ただし時間がかかります)、それがどのように機能するかを示します。ここで必要なのは、パターンに一致し、すべての一致を連結することです。これは次のように行われます。

ml_RestrictToChars = function(input,regex) {
    var rx = new RegExp (regex, 'g');
    var matches = input.match (rx);
    return matches.join ('');
};

最初の行はこれを「グローバル」正規表現にし、これにより match() の動作が変更されます。2 行目はすべての一致を配列で返し、最後の行はそれらを 1 つの文字列に結合して返します。

于 2012-11-24T11:16:23.123 に答える