使用正则表达式正/负前瞻替换字符?

时间:2013-10-29 13:38:57

标签: javascript regex

我有这个字符串:

var a='abc123#xyz123';

我想构建2个正则表达式替换函数:

1)将执行的未来'#'替换为'*'(不包括'#')

所以结果应该是这样的:

'******#xyz123'

2)将所有的未来'#'字符替换为'*'(不包括'#')

所以结果应该是这样的:

'abc123#******'

我尝试了什么:

For the positive lookahead :

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

问题:

如何让我的正则表达式按预期工作?

3 个答案:

答案 0 :(得分:4)

第一部分使用前瞻:

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

<强>解释

此正则表达式使用前瞻查找#所跟随的任何字符,并将其替换为*

第二部分使用替换回调:

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

<强>解释

此代码在#之后找到文本。回调函数内部用星号替换每个字符。

答案 1 :(得分:1)

您可以使用indexOfsubstr代替:

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#******"

答案 2 :(得分:1)

如果你坚持使用简单的正则表达式:

第一个已经回答了。第二个可以写得类似:

a.replace(/[^#](?![^#]*#)/g, '*')
  • (?![^#]*#)是一个负面预测,用于检查当前字符后是否一英镑。
  • [^#]还会检查当前字符是不是英镑。 (我们也可以使用/(?![^#]*#)./g,但它不太漂亮。

一个积极的选择是:

a.replace(/[^#](?=[^#]*$)/g, '*');
  • 这与第一个非常相似:(?=[^#]*$)检查我们前面只有非磅数,直到字符串结束。

在这两个选项中,没有磅数的字符串中的所有字符都将被替换:"abcd" - &gt; "****"