c# - 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等语言识别工具来更快地进行操作。
推荐阅读
- angular-routing - Angular 8 路由无法正确导航
- nftables - 在 nftables 中添加规则时如何指定子网掩码?
- javascript - 动态文本格式
- python - 您将如何使用 psutil 杀死超过持续时间的空闲进程?
- ssas - MDX函数计算年同比差异
- python-3.x - numpy.where - 计算 True 语句,即使条件为 False
- flutter - 我可以在 Dart 中模拟鸭子打字吗?
- java - 如何在 Java 中使用 BouncyCastle PGP 实用程序实现增量加密?
- google-maps - Flutter - 如何删除谷歌地图中的标记?
- sql-server - Nginx 代理 SQL 数据库 URL