我有一个类似于
的字符串
SOI; 1; 2; 3; 4; 5; 6; 7; SOI; 8; 9; 10; 11; 12; EOI; 13;的 EOI; SOI; 14; 15; 16; 17; 18;的 EOI;
这里我必须从SOI开始分割字符串;到EOI;
输出应该像
[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;
请为我提供更好的解决方案。 感谢
答案 0 :(得分:0)
我想我会在程序上这样做,而不是使用正则表达式。
编辑:以下解决方案有错误,第一个和第三个列表是相同的。我要离开了,因为它可能仍然是朝着正确方向的暗示。
1)将值设置为零
2)读取字符串中的下一个标记
3)如果令牌是SOI,则将值1加1
4)如果令牌是EOI,则从值
中删除1
5)如果token是数字,则根据Value将其添加到不同的数组(或列表)中
6)GOTO 2
答案 1 :(得分:0)
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();
}
}