【发布时间】:2013-08-21 14:22:27
【问题描述】:
我要从遗留系统中解析一个位置基础文件。文件中的每一列都有固定的列宽,每行最多可以有 80 个字符长。问题是你不知道一行有多长。有时他们只填写了前五列,有时他们使用了所有列。
如果我知道使用了所有 80 个字符,那么我可以这样做:
^\s*
(?<a>\w{3})
(?<b>[ \d]{2})
(?<c>[ 0-9a-fA-F]{2})
(?<d>.{20})
...
但是这样做的问题是,如果缺少最后一列,则该行将不匹配。最后一列的字符数甚至可以少于该列的最大值。
查看示例
Text to match a b c d
"AQM45A3A text " => AQM 45 A3 "A text " //group d has 9 chars instead of 20
"AQM45F5" => AQM 45 F5 //group d is missing
"AQM4" => AQM 4 //group b has 1 char instead of 2
"AQM4 ASome Text" => AQM 4 A "Some Text" //group b and c only uses one char, but fill up the gap with space
"AQM4FSome Text" => No match, group b should have two numbers, but it is only one.
"COM*A comment" => Comments do not match (all comments are prefixed with COM*)
" " => Empty lines do not match
我应该如何设计正则表达式来匹配这个?
编辑 1
在此示例中,我要解析的每一行都以 AQM 开头
- a 列始终从位置 0 开始
- b 列总是从位置 3 开始
- 列 c 始终从位置 5 开始
- d 列始终从位置 7 开始
如果一列没有使用其所有空间,则文件是否包含空格 只能修剪最后使用的列
编辑 2 为了更清楚起见,我在这里附上了一些数据可能是什么样子的例子,以及列的定义(请注意,我在问题前面提到的例子被大大简化了)
【问题讨论】:
-
您的要求不是很清楚。您的示例中的哪些行应该匹配,哪些不应该匹配?为什么?
-
对不起。示例中的所有行都应该匹配。任务是获取每行中存在的所有列。我添加了更多示例来显示不匹配的行
-
您遇到的主要问题是列之间没有任何明确的分隔符,由于每列中的字符数是可变的,因此什么可以限定某个字符出现在该列或该列中?
-
每一列的字符数是固定的,除了最后一列。最后一列可以修剪
-
我添加了一个新的列示例,列更短并用空格填充空白
标签: c# regex parsing text-parsing string-parsing