在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。
请给我一个更好的解决方案。由于
我想我会按程序来做,而不是使用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();
}
}