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对此最合适吗?任何建议将不胜感激。

解决方法

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

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

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

,

我同意CoolBots,但是,如果您确实想要大量令人作呕的正则表达式,则应根据我对您的要求的理解来起作用:

1 - File Record Header\n(5 - Batch Record Header\n6 - Entry Detail Record\n(7 - Addenda Record\n)?8 - Batch Control Record\n)+9 - File Control Record\n?

以下是带有示例的正则表达式测试器的链接: https://regexr.com/5a7ti

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...