我想用星号替换正则表达式的第一部分。取决于正则表达式,例如:
案例1
http://example.com/path1/path2?abcd
=> http://example.com/path1/**********
正则表达式1 :/^(https?:\/\/.+\/path1\/?)(.+)/
,但我希望将第2组中的每个字符分别替换为*
或
案例2
person@example.com
=> ******@example.com
正则表达式2
/^(.+)(@.+)$/
,类似地,我希望将 first 捕获组中的所有字符分别替换为*
我尝试使用捕获组,但是随后,我剩下*@example.com
let email = `person@example.com`;
let regex = /^(.+)(@.+)$/;
console.log(email.replace(regex, '*$2'));
let url = `http://example.com/path1/path2?abcd`;
let regex = /^(https?:\/\/.+\/path1\/?)(.+)/;
console.log(url.replace(regex, '$1*'));
答案 0 :(得分:4)
您可以使用粘性标记y(但Internet Explorer不支持它):
s = s.replace(/(^https?:\/\/.*?\/path1\/?|(?!^))./gy, '$1*')
但是最简单的方法(所有地方都支持)是使用函数作为替换参数。
s = s.replace(/^(https?:\/\/.+\/path1\/?)(.*)/, function (_, m1, m2) {
return m1 + '*'.repeat(m2.length);
});
对于第二种情况,您可以简单地检查当前位置之后是否有@
:
s = s.replace(/.(?=.*@)/g, '*');
答案 1 :(得分:3)
您可以使用
let email = `person@example.com`;
let regex = /[^@]/gy;
console.log(email.replace(regex, '*'));
// OR
console.log(email.replace(/(.*)@/, function ($0,$1) {
return '*'.repeat($1.length) + "@";
}));
和
let url = `http://example.com/path1/path2?abcd`;
let regex = /^(https?:\/\/.+\/path1\/?)(.*)/gy;
console.log(url.replace(regex, (_,$1,$2) => `${$1}${'*'.repeat($2.length)}` ));
// OR
console.log(url.replace(regex, function (_,$1,$2) {
return $1 + ('*'.repeat($2.length));
}));
对于.replace(/[^@]/gy, '*')
,从字符串开头的@
以外的每个字符都被*
替换(因此,直到第一个@
)。 / p>
对于.replace(/(.*)@/, function ($0,$1) { return '*'.repeat($1.length) + "@"; })
,直到最后@
的所有字符都被捕获到组1中,然后将匹配项替换为与组1值的长度+相同的星号。 @
字符(由于它是使用正则表达式部分的一部分,因此应添加到替换模式中。)
.replace(regex, (_,$1,$2) => `${$1}${'*'.repeat($2.length)}` )
遵循与上述情况相同的逻辑:捕获需要替换的部分,将其传递到匿名回调方法中,并使用一些代码来操纵其值。