我正在用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; ] +)
如果数据可能包含空格,我在这个模式中添加一个空白字符。这是正确的方法吗?或者这样的文本会出现问题(例如列不匹配)?
由于
答案 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
(任何字符,但空格)