我需要帮助来开发一个逻辑,允许我在字符串集合中找到字符串的第一部分。以下是一些真实的样本数据:
string s1 = "DARK BLUE |d RBH 775 GREEN |v BHM 554 |r 0012"
string s2 = "MEGA |m RMV 451X"
string s3 = "UPR INT|c 0124 UPR|r 0006"
string s4 = "DARK GREEN 021|r 0004"
string s5 = "02.80|r x12 03.00|r calc"
string s6 = "03.33|r calc"
预期产出:
string out1[] = "DARK BLUE ", "|d RBH 775 GREEN |v BHM 554 |r 0012""
string out2[] = "MEGA ", "|m RMV 451X"
string out3[] = "UPR ", "INT|c 0124 UPR|r 0006"
string out4[] = "DARK GREEN ", "021|r 0004"
string out5[] = "02.80", "|r x12 03.00|r calc"
string out6[] = "03.33", "|r calc"
通常,所有字符串都带有2种模式:
模式1 :(值)(|带字母)(值)(|带字母)...
模式2 :(值)(值)(|带字母)(键)(值)(|带字母)(键)...
也可以使用模式1和2的组合,即:(值)(|带字母)(值)(|带字母)(键)(值)(|带字母)。 ..,但我认为这不重要,因为我只需要确定"第一部分的模式"
备注: 我能够根据具体情况解决问题:
对于s1,s2,s5和s6,我只能找到第一个索引,然后将第0个子串到第一个管道,然后是其余部分;对于s3,我可以找到第一个空白空间"并采取子串;然后对于s4,我将找到第一个|,然后找到最后一个空的空间"在|之前,并取下子串。
问题是:大约有40,000多个字符串,所以我几乎不可能根据具体情况拆分字符串。我想知道是否可以编写一个可以自动将字符串分成两部分的逻辑?
更新:尽管有两个普通模式,但每种模式都有一些细微差别。例如,s1和s2:|之前有空格,但s5和s6没有空格。
答案 0 :(得分:0)
我相信你可以用正则表达式来解决这个问题。但我绝不是一个正则表达式专家。但是根据您提供的信息,手动编码很容易:
string[] Parse(string line)
{
var chars = new List<char>(); // characters since last whitespace
var all = new List<char>();
using(var i = line.GetEnumerator())
while(i.MoveNext())
{
var current = (char)i.Current;
// keep track of characters since last whitespace
if (current == ' ') chars.Clear();
else if (current != '|') chars.Add(current);
// read until first pipe
if(current == '|')
return BuildResult(i, all, chars);
all.Add(current);
}
return new String[]{};
}
string[] BuildResult(IEnumerator i, List<char> all, List<char> chars)
{
var rest = (new[]{'|'}).Concat(ReadRemaining(i));
var diff = all.Count - chars.Count;
IEnumerable<char> start = chars;
IEnumerable<char> end = rest;
if(diff != 0)
{
// if there was a whitespace, the chars
// before | belong to group 1
start = all.Take(diff);
end = chars.Concat(rest);
}
return new []{new String(start.ToArray()), new String(end.ToArray())};
}
string ReadRemaining(IEnumerator i)
{
var rest = new List<Char>();
while(i.MoveNext())
rest.Add((char)i.Current);
return new String(rest.ToArray());
}
这个想法如下:
|
。 s3
和s4
)或第2组(s5
和s6
)基于我们已经看到空白字符的事实。