2016-01-19 21 views
-2

我的输入可以是以下格式的连接字符串:正则表达式面具连接字符串密码

Data Source=server;Initial Catalog=db;Uid=username;Pwd=password; 
db;username;password; 

我需要的结果是:

Data Source=server;Initial Catalog=db;Uid=username;Pwd=********; 
db;username;********; 

我知道密码。密码可以等于连接字符串中的另一个变量。我需要星号的数量来匹配密码中的字符数。

+2

_Hoping一个干净的正则表达式的解决方案,希望一一行._,你有什么尝试? – Tushar

+1

如果密码包含分号,该怎么办? – nnnnnn

回答

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); 
}) 
+0

很酷的解决方案。你可以使用分号处理密码和星号来匹配密码中的字符数吗? – Mike

+0

@Mike检查更新的答案 – ashishmohite

+0

谢谢Neo。我还想出了如何让我的功能获得密码,所以我现在可以获得。 – Mike

0

你可以使用正则表达式来替换字符串中的文本。我将该面具的长度与密码长度相同,这是可选的。

  • \b字屏障
  • ​​精确匹配
  • ([^;]+)东西,这不是一个分号。一个或多个(捕捉响应)
  • gim修饰符全球性的,不区分大小写,多

改变面膜的功能,由于@ Arthur2e5,的评论

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>

+0

'ret + ='*'* pass.length'并且我个人认为即使泄漏长度也不是一个好主意......无论如何。 – Arthur2e5

+0

我通过数字乘以字符串 – synthet1c

+1

Grr在Chrome中获得'NaN' ......我必须喝太多的Python。 String.prototype.repeat()应该可以工作。 – Arthur2e5

0

如果你不担心分号和密码等号,这可能是简单的:

s.replace(
    /[^;=]*;$/, 
    function(x) { return "*".repeat(x.length) + ';'; })