4

私はこの文字列を持っています:

var a='abc123#xyz123';

関数を置き換える2つの正規表現を構築したい:

1)未来のあるすべての文字を置き換えます'#'- '*' (「#」を含まない)

結果は次のようになります。

'******#xyz123'

2)未来を持たないすべての文字を置き換えます'#'- '*' (「#」を含まない)

結果は次のようになります。

'abc123#******'

何を試しましたか:

肯定的な先読みの場合:

var a='abc123#xyz123';
alert(a.replace(/(.+(?=#))+/ig,'*'));  //*#xyz123 --wrong result since it is greedy...

質問 :

正規表現を期待どおりに動作させるにはどうすればよいですか?

4

3 に答える 3

5

先読みを使用した最初の部分:

repl = a.replace(/.(?=[^#]*#)/g, "*");
//=> "******#xyz123"

説明:

この正規表現は、#先読みを使用して後に続く文字を検索し、それを に置き換え*ます。

交換コールバックを使用した 2 番目の部分:

repla = a.replace(/#(.*)$/, function(m, t) { return m[0] + t.replace(/./g, '*'); } );
//=> abc123#******

説明:

このコードは、 の後のテキストを検索します#。コールバック関数内では、すべての文字がアスタリスクに置き換えられます。

于 2013-10-29T13:41:11.550 に答える
1

単純な正規表現を主張する場合:

最初のものはすでに答えられています。2番目も同様に書くことができます:

a.replace(/[^#](?![^#]*#)/g, '*')
  • (?![^#]*#)現在の文字の後にポンドがないことを確認する否定的な先読みです。
  • [^#]また、現在の文字がポンドでないことも確認します。( も使用でき/(?![^#]*#)./gましたが、あまりきれいではありません。

肯定的なオプションは次のとおりです。

a.replace(/[^#](?=[^#]*$)/g, '*');
  • これは最初のものと非常によく似ています:(?=[^#]*$)文字列の終わりまで、非ポンドのみが先にあることを確認します。

この両方のオプションで、ポンドを含まない文字列内のすべての文字が置き換えられます: "abcd"->"****"

于 2013-10-29T14:56:08.467 に答える
1

代わりにindexOfandを使用できます。substr

function maskBeforeAfter(before, str, character, maskCharacter) {
    character = character || '#';
    maskCharacter = maskCharacter || '*';

    var characterPosition = str.indexOf(character);
    if (characterPosition > -1) {
        var mask = '';
        if (before) {
            for (var i = 0; i < characterPosition; i++) {
                mask += maskCharacter;
            }
            return mask + str.substr(characterPosition);
        } else {
            for (var i = 0; i < str.length - characterPosition - 1; i++) {
                mask += maskCharacter;
            }
            return str.substr(0, characterPosition + 1) + mask;
        }
    }
    return str;
}

function maskBefore(str, character, maskCharacter) {
    return maskBeforeAfter(true, str, character, maskCharacter);
}

function maskAfter(str, character, maskCharacter) {
    return maskBeforeAfter(false, str, character, maskCharacter);
}

> var a = 'abc12345#xyz123';

> maskBefore(a);
"********#xyz123"

> maskAfter(a);
"abc12345#******"
于 2013-10-29T13:52:48.637 に答える