首页 > 解决方案 > C# 中的 ACH 模式匹配

问题描述

我正在开发一个自动清算所 (ACH) 应用程序,并且正在进行文件验证。

第一个验证我需要验证 ACH 文件是否具有正确的记录类型模式。

模式是这样的:

    1 - File Record Header
    5 - Batch Record Header
    6 - Entry Detail Record
    7 - Addenda Record
    8 - Batch Control Record
    9 - File Control Record

数字是记录类型或行的第一个字符。文本描述了记录类型。

我想测试一个文件是否遵循上述模式..

一些变化,包括以下..

不需要附录记录

    1 - File Record Header
    5 - Batch Record Header
    6 - Entry Detail Record
    8 - Batch Control Record
    9 - File Control Record

文件可以有一个或多个批次..

1 - File Record Header
5 - Batch Record Header
6 - Entry Detail Record
7 - Addenda Record
8 - Batch Control Record
5 - Batch Record Header
6 - Entry Detail Record
7 - Addenda Record
8 - Batch Control Record
5 - Batch Record Header
6 - Entry Detail Record
7 - Addenda Record
8 - Batch Control Record
9 - File Control Record

文件记录头必须位于文件的顶部,因此以下操作将失败...

5 - Batch Record Header
1 - File Record Header
6 - Entry Detail Record
7 - Addenda Record
8 - Batch Control Record
9 - File Control Record

RegEx 最适合这个吗?任何建议将不胜感激。

标签: c#pattern-matchingtext-files

解决方案


根据您的描述,这听起来像是一份迷你 DSL(领域特定语言)的工作。虽然 RegEx 在标记化输入方面是一个好的开始,但我认为规则对于常规语言来说可能过于复杂。我会使用某种上下文无关语法 (CFG) 来表达语法,并编写一个解析器以确保正确遵循规则。在这种情况下,我不会完全依赖 RegEx。

你已经为你的 DSL 定义了一套非常好的规则——下一步就是将其转化为词汇和句法语法。该方法类似于编译器的前端部分- 直至抽象语法树(AST),然后您可以对其进行完全验证。没有后端(优化或代码生成) ——一旦你验证了你的解析树,你要么有语法错误(所以,输入被拒绝),或者结构正确(所以,输入被接受)。

您可以利用ANTLR语言识别工具来更快地进行操作。


推荐阅读