レガシー システムの位置ベース ファイルを解析します。ファイル内の各列の列幅は固定で、各行の長さは最大 80 文字です。問題は、行の長さが分からないことです。最初の 5 列しか入力していない場合もあれば、すべての列が使用されている場合もあります。
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 より明確にするために、データがどのように見えるかの例と列の定義をここに同封します(質問で前述した例は非常に単純化されていることに注意してください)