-1

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

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. 如您所见,当您看到我每行只有 4 个元素(列)时,拆分创建了 6 个元素 source[0] = "" 和 source[5] =""。
  2. 对于具有第 4 列的第 3 行,如果我有空格,它会为其创建一个位置,但如果没有空格,则此列会丢失。

那么用正则表达式或其他解决方案拆分的最佳模式或解决方案将是什么!我想分割固定宽度。谢谢。

4

2 回答 2

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)
于 2013-11-04T01:50:06.723 回答
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;
}
于 2013-11-04T01:50:18.957 回答