我需要使用 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})