c#と正規表現を使用して固定幅のレコードを解析する必要があります。各レコードにはいくつかの固定幅フィールドが含まれており、各フィールドには重要な検証ルールが含まれている可能性があります。私が抱えている問題は、固定幅のフィールド境界を越えて適用される一致です。
ルールがないと、長さ13の固定幅の文字列を次のように4つの部分に簡単に分割できます。
(?=^.{13}$).{1}.{5}.{6}.{1}
フィールドルールの例を次に示します。フィールドはすべてスペースにするか、[AZ]で始めて、スペースを右に埋めることができます。文字の間にスペースを入れることはできません
フィールドが私が検証しなければならない唯一のものである場合、私はこれを使用することができます:
(?=^[A-Z ]{5}$)([ ]{5}|[A-Z]+[ ]*)
より長いリストの一部としてこの検証を追加すると、先読みから^と$を削除する必要があり、長さが5ではない一致を取得し始めます。
これは、完全な正規表現と、式に一致する必要があるサンプルテキストと一致しないサンプルテキストです。
(?=^[A-Z ]{13}$)A(?=[A-Z ]{5})([ ]{5}|(?>[A-Z]{1,5})[ ]{0,4})(?=[A-Z ]{6})([ ]{6}|(?>[A-Z]{1,6})[ ]{0,5})Z
各フィールドで、すぐ次のXX文字が一致に使用され、一致が重複しないようにルールを実装するにはどうすればよいですか?
一致する必要がある行:
ABCDEFGHIJKLZ
A Z
AB Z
A G Z
AB G Z
ABCDEF Z
ABCDEFG Z
A GHIJKLZ
AB GHIJKLZ
一致してはならない行:
AB D Z
AB D F Z
AB F Z
A G I Z
A G I LZ
A G LZ
AB FG LZ
AB D FG Z
AB FG I Z
AB D FG i Z
次の3つは一致しないはずですが、一致します。
AB FG Z
AB FGH Z
AB EFGH Z
編集:
明確にするための名前付きキャプチャを使用した一般的なソリューション(Ωmegaの回答に基づく):
(?<F1>F1Regex)(?<=^.{Len(F1)})
(?<F2>F2Regex)(?<=^.{Len(F1+F2)})
(?<F3>F3Regex)(?<=^.{Len(F1+F2+F3)})
...
(?<Fn>FnRegex)
別の例:正規表現とゼロ幅の正のルックバックの間のスペース(?<=はわかりやすくするためのものです。
(?<F1>\d{2}) (?<=^.{2})
(?<F2>[A-Z]{5}) (?<=^.{7})
(?<F3>\d{4}) (?<=^.{11})
(?<F4>[A-Z]{6}) (?<=^.{17})
(?<F5>\d{4})