【发布时间】:2012-11-08 20:59:51
【问题描述】:
我继承了一个银行接口解析器。以前的开发人员实际上做得很漂亮。从银行进来的文件是一个固定长度的字段。他从下载中解析该记录的方式是这样的
public static final String HEADER_RECORD_REGEX = "^(\\d{3})(\\d{12})(.{20})(\\d\\d)(\\d\\d)(\\d\\d)(\\d{12})(\\d\\d)$";
private static final int BANK_ID = 1;
private static final int ACCOUNT_ID = 2;
private static final int COMPANY_NAME = 3;
private static final int MONTH = 4;
private static final int DAY = 5;
private static final int YEAR = 6;
private static final int SEQUENCE = 7;
private static final int TYPE_CODE = 8;
private static final int GROUP_COUNT = TYPE_CODE;
if ( GROUP_COUNT == matcher.groupCount() ) {
setBankId( matcher.group( BANK_ID ) );
setAccountId( matcher.group( ACCOUNT_ID ) );
setCompanyName( matcher.group( COMPANY_NAME ) );
setProcessDate( matcher.group( MONTH ), matcher.group( DAY ),
matcher.group( YEAR ) );
setSeqNumber( matcher.group( SEQUENCE ) );
setTypeCode( matcher.group( TYPE_CODE ) );
}
我有一个新的要求来扭转这个过程,并从银行实际生成模拟文件,以便我们进行测试。使用这种方法,有没有办法我可以使用相同的正则表达式方法来反转该过程来生成文件,或者我只是回到构建标准解析器。
谢谢
【问题讨论】:
-
反向是什么意思?从模拟结果文件创建固定长度的数据文件?
-
好吧,逆向这个过程不是解析,而是它的格式。所以,
new Formatter().format("%3.3s%12.12s%20.20s%2.2s%2.2s%2.2s%12.12s%2.2s", bankID, acctID, companyName, month, day, year, seq, typeCode);或类似的东西。此外,回想起来,对于我们聪明的解析器编写者来说,以编程方式定义每个字段的长度而不是将它们硬编码到他的正则表达式中会更有用。 -
我希望他们没有解雇最初写这篇文章的人,因为你可以用各种可怕的方式来解决这样的问题,他一点也不差。
-
GROUP_COUNT的那一点没有意义。matcher.groupCount()返回的值是与 Matcher 关联的 Pattern 对象的静态属性。即使匹配尝试失败,它也将始终相同。