【问题标题】:Parsing Tabular Data with Regular Expression使用正则表达式解析表格数据
【发布时间】:2015-09-05 11:26:53
【问题描述】:

我正在用 C# 编写一个应用程序,它解析一些文本文件并从中获取信息。我需要解析如下表格数据并将信息填充到类的属性中。

我对表格和列标题没有任何问题。我也可以使用捕获组获取数据,但在某些情况下,某些值可能为空(或可能包含空格,如第 4 数据行 Col6)

示例:

===============================================================================
Table Header
===============================================================================
Col1         Col2      Col3 Col4 Col5       Col6
-------------------------------------------------------------------------------
21           abc       xyz  xyz  1          blablabla
22           abc       xyz       1          bla-bla-bla
103          abc       xyz  xyz  1          
4000         abc       xyz  xyz  1          blabla bla
4001         abc       xyz  xyz  1          

我有这样的数据线模式:

([\w\d\-_\.\*\#\:\\/\<\>]+)\s+([\w\d\-_\.\*\#\:\\/\<\>]+)\s+([\w\d\-_\.\*\#\:\\/\<\>]+)\s+([\w\d\-_\.\*\#\:\\/\<\>]+)\s+([\w\d\-_\.\*\#\:\\/\<\>]+)\s+([\w\d\-_\.\*\#\:\\/\<\>]+)?$

当所有列都包含数据时,它可以正常工作。当我在最后一个捕获组(对于 Col6)中的字符类中添加一个空白字符时,它开始将两个连续的行匹配在一起。我需要逐行匹配。我该怎么做?

第二个问题是,对于许多列,我需要“除空格之外的任何字符”方法,我在捕获组中使用此模式:([\w\d-_.*#:\/\]+ )

如果数据可能包含空格,我将在此模式中添加一个空格字符。这是正确的方法吗?还是在这样的文本中会出现问题(例如列不匹配)?

谢谢

【问题讨论】:

  • 两列之间是否有固定长度或制表符是否分开?

标签: c# .net regex parsing


【解决方案1】:

这不能用正则表达式来完成。

为了解释原因,让我们以数据中的第二行为例:

Col1         Col2      Col3 Col4 Col5       Col6
-------------------------------------------------------------------------------
22           abc       xyz       1          bla-bla-bla

您处理这种情况的方式可能会将“1”匹配为 Col4,而 Col5 为空。没有条件告诉正则表达式引擎“1”实际上是第 5 列。 Live example

假设数据是固定长度的,我建议使用String.Substring()


至于您的第二个问题
除空格外的任何字符 = [^ ] 使用 Negated character class
或者您可以使用\S(除空格以外的任何字符)

【讨论】:

  • 我认为,每列的最大长度是固定的,所以我决定使用这种方法。感谢您的帮助
猜你喜欢
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
  • 2020-08-08
  • 2016-03-31
  • 2016-09-24
相关资源
最近更新 更多