2014-08-27 51 views
3

我想爲用戶提供一個奇特的許可證密鑰文本框,這將插入破折號。 關鍵應該是20個字符長(4組,每組5個字符)C#文本框的許可證密鑰自動格式化

我嘗試使用正則表達式,第一:

Regex.Replace(text, ".{5}", "$0-"); 

,其是如前圍即使插入的問題時,有不以下字符,例如 AAAAA-,導致無法刪除短劃線,因爲它會自動重新插入。

然後我想過告訴正則表達式應該有下面的字符

Regex.Replace(text, "(.{5})(.)", "$1-$2"); 

但是,其將鑰匙插入的5-6-6組...

任何想法?

+2

我平時見過這4個文本框的方式,但是當您填寫每一個它*標籤*移交給下一個自動。 – 2014-08-27 16:07:05

回答

6

使用負向前視來避免最後添加-。它匹配來自第一個但不是最後5個數字的輸入字符串的每個5位數字。

.{5}(?!$) 

替換字符串

$0- 

DEMO

string str = "12345678909876543212"; 
string result = Regex.Replace(str, @".{5}(?!$)", "$0-"); 
Console.WriteLine(result); 
Console.ReadLine(); 

輸出:

12345-67890-98765-43212 

IDEONE

0
.{5}[^$] 

使用this.This不會放在 - 結束。

通過

$0- 

見演示更換。

http://regex101.com/r/vY0rD6/3

+2

只有當您在輸入字符串中不存在的非char類中放入任何字符時,它纔有效。 char類中的'$'匹配文字'$'符號而不是行尾。請參閱http://regex101.com/r/vY0rD6/4 – 2014-08-27 16:27:55

+0

yups完全錯過了它。 – vks 2014-08-27 17:05:24

0

一個LINQ風格的方法可能是根據自己的喜好,如果你看中了非正則表達式的方法...

這可以在LinqPad跑出:

var sourceReg = "abcdeFGHIJ12345klmno"; 
var splitLength=5; 

var regList = Enumerable.Range(0, sourceReg.Length/splitLength).Select(i => sourceReg.Substring(i*splitLength, splitLength)); 
regList.Dump("Registration List"); 

var regSeparated = string.Join("-", regList); 
regSeparated.Dump("Registration with Separators"); 

注:沒有按沒有考慮到不完全分割的註冊碼。

見加上其他上述方法在一個類似的問題:

Add separator to string at every N characters?

0

代碼

string key = "12345678909876543212"; 
licenseBox.Text = System.Text.RegularExpressions.Regex.Replace(key, @".{5}(?!$)", "$0-"); 

「至於上面提到」 - 應該可以正常工作。

而以下可能也適合你。

代碼

string key = "12345678909876543212"; 
licenseBox.Text = String.Format("{0}-{1}-{2}-{3}", key.Substring(0, 5), key.Substring(5, 5), key.Substring(10, 5), key.Substring(15, 5)); 

輸出

12345-67890-98765-43212