如何在C#中使用2个字符进行字符串拆分?

如何在C#中使用2个字符进行字符串拆分?,c#,string,split,C#,String,Split,我知道如果有一个字母,一个数字,我想替换它,我该如何进行字符串拆分 但是,我如何在不替换任何现有字母、数字等的情况下,将string.Split()按2char计数呢 示例: string MAC = "00122345" var strings = new string[] { "00122345", "001223453" }; foreach (var str in strings) { Console.WriteLine(string.Join(":",

我知道如果有一个字母,一个数字,我想替换它,我该如何进行字符串拆分

但是,我如何在不替换任何现有字母、数字等的情况下,将
string.Split()
按2
char
计数呢

示例:

string MAC = "00122345"
var strings = new string[] { 
    "00122345", 
    "001223453" 
};

foreach (var str in strings)
{
    Console.WriteLine(string.Join(":", str.SplitNthParts(2)));
}
// 00:12:23:45
// 00:12:23:45:3

我希望该字符串输出:00:12:23:45

string newStr=System.Text.RegularExpressions.Regex.Replace(MAC,“{2}”,“$0:”);
要修剪最后一个冒号,可以使用类似这样的方法

newStr.TrimEnd(':');

您可以使用以下内容:

string newStr=System.Text.RegularExpressions.Regex.Replace(MAC,“{2}”,“$0:”);
要修剪最后一个冒号,可以使用类似这样的方法

newStr.TrimEnd(':');
试试这种方法

    string MAC = "00122345";
    MAC = System.Text.RegularExpressions.Regex.Replace(MAC,".{2}", "$0:");
    MAC = MAC.Substring(0,MAC.Length-1);
    Console.WriteLine(MAC);
这样试试

    string MAC = "00122345";
    MAC = System.Text.RegularExpressions.Regex.Replace(MAC,".{2}", "$0:");
    MAC = MAC.Substring(0,MAC.Length-1);
    Console.WriteLine(MAC);

您可以创建一个LINQ扩展方法,为您提供一组零件:

public static class Extensions
{
    public static IEnumerable<string> SplitNthParts(this string source, int partSize)
    {
        if (string.IsNullOrEmpty(source))
        {
            throw new ArgumentException("String cannot be null or empty.", nameof(source));
        }

        if (partSize < 1)
        {
            throw new ArgumentException("Part size has to be greater than zero.", nameof(partSize));
        }

        return Enumerable
            .Range(0, (source.Length + partSize - 1) / partSize)
            .Select(pos => source
                .Substring(pos * partSize, 
                    Math.Min(partSize, source.Length - pos * partSize)));
    }
}
说明:

string MAC = "00122345"
var strings = new string[] { 
    "00122345", 
    "001223453" 
};

foreach (var str in strings)
{
    Console.WriteLine(string.Join(":", str.SplitNthParts(2)));
}
// 00:12:23:45
// 00:12:23:45:3
  • 用于获取要切片字符串的位置数。在本例中,是字符串的
    长度+块大小-1
    ,因为我们需要获得足够大的范围来适应剩余的块大小
  • 使用位置乘以2,每2个字符向下移动一次字符串,然后获取
    startIndex
    。如果字符串没有足够的字符容纳另一个块,则必须使用来计算剩余的最小大小。您可以通过字符串的
    长度-当前位置*块大小来计算该值
  • 带有
    “:”
    的最终结果
您还可以将LINQ查询替换为here,以提高较大字符串的性能,因为所有子字符串不会一次存储在内存中:

for (var pos = 0; pos < source.Length; pos += partSize)
{
    yield return source.Substring(pos, Math.Min(partSize, source.Length - pos));
}
for(变量pos=0;pos
您可以创建一个LINQ扩展方法,为您提供一组零件:

public static class Extensions
{
    public static IEnumerable<string> SplitNthParts(this string source, int partSize)
    {
        if (string.IsNullOrEmpty(source))
        {
            throw new ArgumentException("String cannot be null or empty.", nameof(source));
        }

        if (partSize < 1)
        {
            throw new ArgumentException("Part size has to be greater than zero.", nameof(partSize));
        }

        return Enumerable
            .Range(0, (source.Length + partSize - 1) / partSize)
            .Select(pos => source
                .Substring(pos * partSize, 
                    Math.Min(partSize, source.Length - pos * partSize)));
    }
}
说明:

string MAC = "00122345"
var strings = new string[] { 
    "00122345", 
    "001223453" 
};

foreach (var str in strings)
{
    Console.WriteLine(string.Join(":", str.SplitNthParts(2)));
}
// 00:12:23:45
// 00:12:23:45:3
  • 用于获取要切片字符串的位置数。在本例中,是字符串的
    长度+块大小-1
    ,因为我们需要获得足够大的范围来适应剩余的块大小
  • 使用位置乘以2,每2个字符向下移动一次字符串,然后获取
    startIndex
    。如果字符串没有足够的字符容纳另一个块,则必须使用来计算剩余的最小大小。您可以通过字符串的
    长度-当前位置*块大小来计算该值
  • 带有
    “:”
    的最终结果
您还可以将LINQ查询替换为here,以提高较大字符串的性能,因为所有子字符串不会一次存储在内存中:

for (var pos = 0; pos < source.Length; pos += partSize)
{
    yield return source.Substring(pos, Math.Min(partSize, source.Length - pos));
}
for(变量pos=0;pos
一个简单易懂的解决方案

这是一个简单的快速修改答案,您可以轻松更改拆分
char

  • 此答案还检查数字是否为
    偶数
    奇数
    ,以生成合适的
    字符串.Split()

输入:00122345

输出:00:12:23:45


输入:0012234

输出:00:12:23:4



//保存配对的列表
List MACList=新列表();
//把偶数分成几对

对于(int i=1;i而言,这是一个易于理解且简单的解决方案

这是一个简单的快速修改答案,您可以轻松更改拆分
char

  • 此答案还检查数字是否为
    偶数
    奇数
    ,以生成合适的
    字符串.Split()

输入:00122345

输出:00:12:23:45


输入:0012234

输出:00:12:23:4



//保存配对的列表
List MACList=新列表();
//把偶数分成几对

对于(int i=1;i相当快的解决方案,比当前接受的答案(正则表达式解决方案)快8-10倍,比LINQ解决方案快3-4倍

public static string Format(this string s, string separator, int length)
{
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < s.Length; i += length)
    {
        sb.Append(s.Substring(i, Math.Min(s.Length - i, length)));
        if (i < s.Length - length)
        {
            sb.Append(separator);
        }
    }

    return sb.ToString();
}

非常快的解决方案,比当前接受的答案(正则表达式解决方案)快8-10倍,比LINQ解决方案快3-4倍

public static string Format(this string s, string separator, int length)
{
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < s.Length; i += length)
    {
        sb.Append(s.Substring(i, Math.Min(s.Length - i, length)));
        if (i < s.Length - length)
        {
            sb.Append(separator);
        }
    }

    return sb.ToString();
}
以下是一(1)行备选方案

以下是一(1)行备选方案


您的代码结果是“00 12 23 45”。如果将“$0”更改为“$0:”-它将返回“00:12:23:45:”,但所需的答案是“00:12:23:45”谢谢@NitikaChopra我在想OP可以解决这个问题。哈哈。无论如何更新了答案。我没有这么做。我不知道是谁否决了你的答案。事实上,我帮你回答了问题。我没有对你说@NitikaChopra,我是在问谁做的!让我们看看。你的代码结果是“00 12 23 45”。如果你将“$0”改为“$0:”-它返回“00:12:23:45”:但要求的答案是“00:12:23:45”谢谢@NitikaChopra我在想OP可以解决这个问题。哈哈。无论如何,更新了答案。我没有这么做。我不知道谁会否决你的答案。事实上,我帮你回答了你的问题。我没有对你说@NitikaChopra,我是问谁做的!让我们吧。那只显示00:12。不。试一下这把小提琴,只显示00:12。不。只是在这个提琴中尝试可能更快,但也更好?看到这个问题,应该如何使用它?@Luuk我刚刚添加了一个示例cs0176成员的string.Format(string,object)'无法使用实例引用访问;请改为使用类型名称限定它。如果不在同一命名空间中,则必须使用
添加一个
,以导入我创建的扩展方法,以检查这是否真的更快,但是……您能准确了解错误以及如何解决(第24行)?也许更快,但也更好?鉴于这个问题如此,应该如何使用它?@luuki刚刚添加了一个exampleCS0176成员