用正则表达式解析表格数据

时间:2015-09-05 11:26:53

标签: c# .net regex parsing

我正在用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),它开始将两个连续的行匹配在一起。我需要逐行匹配。我怎么能这样做?

第二个问题是,对于许多列,我需要“任何char但空间”方法,并且我在捕获组中使用此模式:([\ w \ d -_。*#:\ / \&lt;&gt; ] +)

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

由于

1 个答案:

答案 0 :(得分:0)

使用正则表达式无法做到这一点。

要解释原因,让我们在您的数据中选择第二行:

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(任何字符,但空格)