2016-01-19 43 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) + ';'; })