将字符串拆分为多个字母和数字段

时间:2017-11-15 19:03:33

标签: c#

我有一个类似" ABCD232ERE44RR"的字符串。如何通过字母/数字将其拆分为单独的段。我需要: 段1:ABCD 段2:232 细分3:ERE Segment4:44

可能有任意数量的细分。我在想Regex,但不知道如何正确地写它

4 个答案:

答案 0 :(得分:2)

你可以这样做;

using System;
using System.Collections.Generic;   
using System.Text.RegularExpressions;
public class Program
{
    public static void Main()
    {
        var substrings = Regex.Split("ABCD232ERE44RR", @"[^A-Z0-9]+|(?<=[A-Z])(?=[0-9])|(?<=[0-9])(?=[A-Z])");
        Console.WriteLine(string.Join(",",substrings));
    }
}

Output : ABCD,232,ERE,44,RR

答案 1 :(得分:2)

我建议将此视为找到与目标模式的匹配,而不是分成您想要的部分。拆分对分隔符具有重要意义,而匹配则对令牌具有重要意义。

您可以使用Regex.Matches

  

在指定的输入字符串中搜索所有出现的指定正则表达式。

var matches = Regex.Matches("ABCD232ERE44RR", "[A-Z]+|[0-9]+");

foreach (Match match in matches) {
     Console.WriteLine("Found '{0}' at position {1}", match.Value, match.Index);
}

答案 2 :(得分:1)

尝试类似:

((A-Z)+(\d)*)+

答案 3 :(得分:0)

如果您决定不使用正则表达式,您可以随时使用手动路线。

const string str = "ABCD232ERE44RR1SGGSG3333GSDGSDG";

var result = new List<StringBuilder> 
{
    new StringBuilder()
};

char last = str[0];

result.Last().Append(last);

bool isLastNum = Char.IsNumber(last);

for (int i = 1; i < str.Length; i++)
{
    char ch = str[i];

    if (!((Char.IsDigit(ch) && isLastNum) || (Char.IsLetter(ch) && !isLastNum)))
    {
        result.Add(new StringBuilder());
    }

    result.Last().Append(ch);
    last = ch;
    isLastNum = Char.IsDigit(ch);
}