有谁知道如何使用正则表达式分割此文件
1 TESTAAA SERNUM A DESCRIPTION
2 TESTBBB ANOTHR ANOTHER DESCRIPTION
3 TESTXXX BLAHBL
每列的长度
{id} {firsttext} {serialhere} {description}
4 22 6 30+
我打算用正则表达式将它存储在像这样的字符串[]中。
using (StreamReader sr = new StreamReader("c:\\file.txt"))
{
string line = string.Empty;
string[] source = null;
while ((line = sr.ReadLine()) != null)
{
source = Regex.Split(line, @"(.{4})(.{22})(.{6})(.+)", RegexOptions.Singleline);
}
}
但我有两个问题。
那么用正则表达式或其他解决方案进行拆分的最佳模式或解决方案将是非常好的!我想拆分固定宽度。 感谢。
答案 0 :(得分:3)
当您已经确切知道获取数据的位置时,使用正则表达式似乎有些过分。使用Substring
方法获取字符串的部分:
string[] source = new string[]{
line.Substring(0, 4),
line.Substring(4, 22),
line.Substring(26, 6),
line.Substring(32)
};
为了使其更易于配置,您可以使用数组中的列宽:
int[] cols = new int[] { 4, 22, 6 };
string[] source = new string[cols.Length + 1];
int ofs = 0;
for (int i = 0; i < cols.Length; i++) {
source[i] = line.Substring(ofs, cols[i]);
ofs += cols[i];
};
source[cols.Length] = line.Substring(ofs)
答案 1 :(得分:2)
如果您有固定的长度,则更容易使用Substring
方法,例如
string id = line.Substring(0, 4);
string firsttext = line.Substring(4, 22);
string serial = line.Substring(26, 6);
string description = line.Substring(32);
如果您真的想使用正则表达式,可以使用下面的表达式。请注意,它仅在前3列中的数据没有空格时才有效。另外,我假设第一列是数字,其余的只是alpha。
String input = "2 TESTBBB ANOTHR ANOTHER DESCRIPTION";
Match match = Regex.Match(input, @"^(\d*)\s*(\w*)\s*(\w*)\s*(.*)$");
if (match.Groups.Count == 5)
{
string id = match.Groups[1].Value;
string firsttext = match.Groups[2].Value;
string serial = match.Groups[3].Value;
string description = match.Groups[4].Value;
}