替换动态大小的捕获组

时间:2019-06-30 15:35:37

标签: javascript node.js regex

我想用星号替换正则表达式的第一部分。取决于正则表达式,例如:

案例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*'));

2 个答案:

答案 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)}` )遵循与上述情况相同的逻辑:捕获需要替换的部分,将其传递到匿名回调方法中,并使用一些代码来操纵其值。