我将从遗留系统中解析一个位置基础文件。文件中的每一列都有固定的列宽,每行最多可以有 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 为了更清楚,我在这里附上了数据可能是什么样子的一些例子,以及列的定义(请注意,我在问题前面提到的例子被大大简化了)