C#文本框许可证密钥自动格式化

时间:2014-08-27 16:05:15

标签: c# regex

我想为用户提供一个花哨的许可证密钥文本框,它会插入破折号。 密钥应该是20个字符长(4组,每组5个字符)

我尝试使用正则表达式,首先:

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

即使没有后续字符,插入短划线也是一个问题,例如 AAAAA-导致无法删除破折号,因为它会自动重新插入。

然后我想到告诉正则表达式应该有一个跟随字符

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

但是将密钥拆分为5-6-6组......

有什么想法吗?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

 .{5}[^$]

使用它。这不会 - 最后。 -

替换为

  $0-

参见演示。

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

答案 2 :(得分: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?

答案 3 :(得分: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