如何用正则表达式C#分割线条

时间:2013-11-04 01:41:32

标签: c# regex split streamreader fixed-width

有谁知道如何使用正则表达式分割此文件

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);
            }

        }

但我有两个问题。

  1. 分割创建了6个元素源[0] =“”和源[5] =“”,如您所见,每行只有4个元素(列)。
  2. 如果第3行有第4列,如果我有空格,它会为它创建一个位置,但如果没有空格,则会错过此列。
  3. 那么用正则表达式或其他解决方案进行拆分的最佳模式或解决方案将是非常好的!我想拆分固定宽度。 感谢。

2 个答案:

答案 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;
}