C# 转换;9954-4740-4491-4414“;至;99:54:47:40:44:91:44:14“;使用正则表达式

C# 转换;9954-4740-4491-4414“;至;99:54:47:40:44:91:44:14“;使用正则表达式,c#,regex,C#,Regex,如果标题不够清晰,以下是解决问题的程序方法: [TestMethod] public void Foo() { var start = "9954-4740-4491-4414"; var sb = new StringBuilder(); var j = 0; for (var i = 0 ; i < start.Length; i++) { if ( start[i] != '-') {

如果标题不够清晰,以下是解决问题的程序方法:

[TestMethod]
public void Foo()
{
    var start = "9954-4740-4491-4414";

    var sb = new StringBuilder();
    var j = 0;
    for (var i = 0 ; i < start.Length; i++)
    {
        if ( start[i] != '-')
        {
            if (j == 2)
            {
                sb.AppendFormat(":{0}", start[i]);
                j = 1;
            }
            else
            {
                sb.Append(start[i]);
                j++;
            }
        }
    }

    var end = sb.ToString();

    Assert.AreEqual(end, "99:54:47:40:44:91:44:14");
}
[TestMethod]
公共图书馆
{
var start=“9954-4740-4491-4414”;
var sb=新的StringBuilder();
var j=0;
对于(变量i=0;i
您不需要它们:去掉“-”字符,然后在每对数字之间插入冒号。除非我误解了所需的输出格式。

如果您使用的是C#4,那么您只需要以下内容:

string result = string.Join(":", Regex.Matches(start, @"\d{2}").Cast<Match>());
我同意“为什么要用正则表达式?”


Regex.Replace版本,尽管我更喜欢Mark的答案:

string res = Regex.Replace(start, 
   @"(\d{2})(\d{2})-(\d{2})(\d{2})-(\d{2})(\d{2})-(\d{2})(\d{2})", 
   @"$1:$2:$3:$4:$5:$6:$7:$8");

经过一段时间的实验,我找到了一种方法,使用一个可以处理无限长输入的正则表达式:

Regex.Replace(start, @"(?'group'\d\d)-|(?'group'\d\d)(?!$)", @"$1:")
当使用具有相同名称的命名组(
(?'name')
)时,捕获存储在相同的组中。这样,就可以用相同的值替换不同的匹配项


它还使用了(
(?!)
东西)。

我首先将正则表达式更改为
(\d{2})(\d{2})
,然后尝试提取捕获组。如果我这里有一个C#编译器/运行时,我会尝试编写一些实际的代码。另一方面,为什么还要麻烦正则表达式呢?为什么不删除所有
-
字符,然后通过移动数字串来构建输出字符串?这里不需要正则表达式。这是出于好奇,不是出于功能或需要。我也喜欢你的代码!我问这个问题只是想看看其他人会想出什么。我喜欢漂亮的代码,我最初的运行对我来说很难看。但是你的。。。所以choice.Had必须将其更改为string.Join(“:”,start.Split('-')。Select(s=>s.Insert(2,“:”).ToArray();要在3中编译。5@Merritt仅当您想将其保存到数组中时才需要。当然。string.Join仅适用于3.5中的字符串数组,然后在.select之后调用.ToArray()。感谢您提供了一个完美的答案。您肯定把它提升了一个档次。我得说它的美丽简直是荒诞。我喜欢它。。。喜欢。这个怎么样
Regex.Replace(start,@“(\d{2})-?(?!$)”,“$1:”)
string res = Regex.Replace(start, 
   @"(\d{2})(\d{2})-(\d{2})(\d{2})-(\d{2})(\d{2})-(\d{2})(\d{2})", 
   @"$1:$2:$3:$4:$5:$6:$7:$8");
Regex.Replace(start, @"(?'group'\d\d)-|(?'group'\d\d)(?!$)", @"$1:")