我有这个字符串:
var a='abc123#xyz123';
我想构建2个正则表达式替换函数:
1)将执行的未来'#'
替换为'*'
(不包括'#')
所以结果应该是这样的:
'******#xyz123'
2)将所有不的未来'#'
字符替换为'*'
(不包括'#')
所以结果应该是这样的:
'abc123#******'
我尝试了什么:
var a='abc123#xyz123';
alert(a.replace(/(.+(?=#))+/ig,'*')); //*#xyz123 --wrong result since it is greedy...
问题:
如何让我的正则表达式按预期工作?
答案 0 :(得分:4)
第一部分使用前瞻:
repl = a.replace(/.(?=[^#]*#)/g, "*");
//=> "******#xyz123"
<强>解释强>
此正则表达式使用前瞻查找#
所跟随的任何字符,并将其替换为*
。
第二部分使用替换回调:
repla = a.replace(/#(.*)$/, function(m, t) { return m[0] + t.replace(/./g, '*'); } );
//=> abc123#******
<强>解释强>
此代码在#
之后找到文本。回调函数内部用星号替换每个字符。
答案 1 :(得分:1)
您可以使用indexOf
和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#******"
答案 2 :(得分:1)
如果你坚持使用简单的正则表达式:
第一个已经回答了。第二个可以写得类似:
a.replace(/[^#](?![^#]*#)/g, '*')
(?![^#]*#)
是一个负面预测,用于检查当前字符后是否一英镑。[^#]
还会检查当前字符是不是英镑。 (我们也可以使用/(?![^#]*#)./g
,但它不太漂亮。一个积极的选择是:
a.replace(/[^#](?=[^#]*$)/g, '*');
(?=[^#]*$)
检查我们前面只有非磅数,直到字符串结束。在这两个选项中,没有磅数的字符串中的所有字符都将被替换:"abcd"
- &gt; "****"