在c#中使用正则表达式拆分字符串

本文关键字:正则表达式 拆分 字符串 | 更新日期: 2023-09-27 18:02:43

我有一个类似于
的字符串 SOI; 1;2;3;4;5;6;7; SOI; 8;9;10;11;12;情绪过分投入; 13;列入意向书;SOI; 14;15;16;17;18;情绪过分投入;

这里我必须从SOI开始拆分字符串;情绪过分投入;
输出应该像

[0] - 1;2;3;4;5;6;7;13;
[1] - 8;9;10;11;12;
[2] - 14;15;16;17;18。

我尝试使用下面的代码

进行分割
string regexexpr = "(?s)(?<=SOI;).+?(?=EOI;)";//@"SOI;(.*?)EOI;";
string sText = "SOI; 1; 2; 3; 4; 5;  6; 7;SOI; 8; 9; 10; 11; 12; EOI; 13; EOI; SOI; 14; 15; 16; 17; 18; EOI;";
MatchCollection matches = Regex.Matches(sText, @regexexpr);
var sample = matches.Cast<Match>().Select(m => m.Value);

但是我得到的输出是
[0] - 1;2;3;4;5;6;7; SOI; 8;9;10;11;12日,
[1] - 14;15;16;17;18。

请给我一个更好的解决方案。由于

在c#中使用正则表达式拆分字符串

我想我会按程序来做,而不是使用regexp。

编辑:下面的解决方案有一个错误,第一个和第三个列表将是相同的。我要离开它,因为它可能仍然是一个正确方向的提示。

1)设置值为0。
2)读取字符串中的下一个标记。
3)如果token为SOI,则Value
加14)如果令牌是EOI,从Value
中删除15)如果token是一个数字,则根据Value将其添加到不同的数组(或列表)中。
6)转到2

    private static List<string> GetLists(string sText)
    {
        string[] output;
        List<string> input = new List<string>();
        input = sText.Split(new string[] {" "}, StringSplitOptions.RemoveEmptyEntries).ToList();
        int count = input.Count(x => x == "SOI;");
        output = new string[count]; // set output array to number of lists in string
        int current = -1;  // start with -1 so first SOI will set it on 0
        int max = -1;
        foreach (var text in input)
        {
            if (text == "SOI;") // set current and max
            {
                current++;
                max++;
            }
            else if (text == "EOI;")
            {
                current--;
                if (current == -1)  // if u reached -1 it means u are out of any list so set current on max so if u will get "SOI" u will get proper number
                {
                    current = max;
                }
            }
            else
            {
                output[current] += text;
            }
        }
        return output.ToList();
    }
}