我的输入可以是以下格式的连接字符串:
Data Source=server;Initial Catalog=db;Uid=username;Pwd=password;
db;username;password;
我需要结果:
Data Source=server;Initial Catalog=db;Uid=username;Pwd=********;
db;username;********;
我知道密码。密码可以等于连接字符串中的另一个变量。我需要星号的数量来匹配密码中的字符数。
答案 0 :(得分:0)
这样的事情应该有帮助
text = "Data Source=server;Initial Catalog=db;Uid=username;Pwd=password;db;username;password;";
"Data Source=server;Initial Catalog=db;Uid=username;Pwd=password;db;username;password;"
text.replace(/(Pwd=)(\w+)/,'$1********').replace(/(\w+);$/,'********')
"Data Source=server;Initial Catalog=db;Uid=username;Pwd=********;db;username;********"
您的评论的解决方案可能类似于
text.replace(/(Pwd=)(\w+);.+;(\w+);$/,function(m,m1,m2,m3){
return "Pwd="+ '*'.repeat(m2.length)+";db;username;"+'*'.repeat(m3.length);
})
答案 1 :(得分:0)
您可以使用正则表达式替换字符串中的文本。我使掩码的长度与密码长度相同,这是可选的。
\b
字障碍pwd=
完全匹配([^;]+)
任何不是半冒号的东西。一个或多个(捕获响应)gim
修饰符,用于全局,不区分大小写,多行由于@Arthur2e5,s评论,更改了掩码功能
var source = "Data Source=server;Initial Catalog=db;Uid=username;Pwd=password;db;username;password;";
var cleaned = source.replace(/\bpwd=([^;]+)/gim, function(_, pass ){
return 'Pwd=' + ('*'.repeat( pass.length ));
});
// one liner not much of a change
var es6oneLine = source.replace(/\bpwd=([^;]+)/gim, (_, pass) => 'Pwd=' + ('*'.repeat( pass.length )));
console.log( source );
console.log( cleaned );
console.log( es6oneLine );
<script src="http://codepen.io/synthet1c/pen/WrQapG.js"></script>
三个选项的性能测试。 String.prototype.repeat
获胜。
console.perf(function testSpeedOfLoopingAndConcatination(){
var str = "";
for( var ii = 0, ll = 8; ii < ll; ii++ ){
str += '*';
};
});
console.perf(function testSpeedOfRegexReplace(){
var str = 'something'.replace(/./g, '*');
});
console.perf(function testSpeedOfStringProtoRepeat(){
var str = '*'.repeat( 8 );
});
<script src="http://codepen.io/synthet1c/pen/WrQapG.js"></script>
答案 2 :(得分:0)
如果您不担心分号和密码中的等号,可以这么简单:
s.replace(
/[^;=]*;$/,
function(x) { return "*".repeat(x.length) + ';'; })