如何使用正则表达式验证MICR代码?
MICR码,全称Magnetic Ink Character Recognition,即磁性墨水字符识别,是银行业普遍采用的一种支票代码识别标准,用于读取支票上面的相关信息。MICR代码基于E13B和CMC7两种字体设计,主要包含了三个要素:银行代码、支票号码和账户号码。到目前为止,MICR码仍是信用证和支票业务中常见的一种支付方式。本文将教你如何使用正则表达式来验证MICR码的有效性,以帮助你进行支票业务的操作。
MICR码有效性的分析
MICR码具有一定的规律和公式,因此我们可以通过对MICR码的格式和规律进行分析,总结出相应的验证规则。MICR码的格式一般为以下三个要素:
- 银行代码:通常是一个三位数字
- 支票号码:是一个6-10位的数字
- 账户号码:通常是一个10-12位的数字
由于MICR码的前两个要素不需要进行格式验证,因此我们可以集中精力对账户号码这一要素进行验证。
在进行正则表达式编写前,我们需要进一步分析和确定MICR码的规则。通过对MICR码对比和分析,我们可以发现:
- 账户号码的位数一般在10-12位之间
- 账户号码中不会出现非数字字符
- CMC7字体编码(即通常所见的MICR码格式)的第一位和最后两位为“<”和“>”,不算在计算有效账户号码的位数之内,但是E13B字体编码中不包含“<”和“>”。
- 以“0”开头的账户号码应该为10位
综上分析,我们可以得到MICR码验证的正则表达式:
(^\\d{10,12})|(^[1-9]\\d{9})
该正则表达式表示:
- 若账户号码位数在10-12位之间,且没有非数字字符,则认为有效
- 若账户号码位数为10位,且以1-9中的数字开头,则也认为是有效。
正则表达式解析:
^
表示以其后面的字符开头\\d{10,12}
表示匹配10-12位数字字符$
表示字符串的结尾位置|
表示或关系^
表示开头位置[1-9]
表示匹配1-9中的任意一个数字\\d{9}$
表示匹配9位数字字符,并以字符串结尾位置结束。
代码实现
下面是使用Java代码对MICR码进行正则表达式验证的实现示例,该示例所用的正则表达式与之前所示的一致:
public class MICRCodeValidator {
public static boolean isValid(String micrCode) {
String pattern = "(^\\d{10,12})|(^[1-9]\\d{9})";
return micrCode.matches(pattern);
}
}
这里使用了Java内置的matches()
方法来判断MICR码的有效性,只要满足指定的正则表达式,就代表验证成功。
测试用例
下面是几组测试用例,用于验证正则表达式的正确性:
@Test
public void testIsValid() {
// 验证10位数字账户号码
assertTrue(MICRCodeValidator.isValid("0123456789<"));
assertTrue(MICRCodeValidator.isValid("<0123456789>"));
assertTrue(MICRCodeValidator.isValid("1234567890"));
// 验证11位数字账户号码
assertTrue(MICRCodeValidator.isValid("01234567890<"));
assertTrue(MICRCodeValidator.isValid("<01234567890>"));
assertTrue(MICRCodeValidator.isValid("12345678901<"));
assertTrue(MICRCodeValidator.isValid("<12345678901>"));
// 验证12位数字账户号码
assertTrue(MICRCodeValidator.isValid("012345678901<"));
assertTrue(MICRCodeValidator.isValid("<012345678901>"));
assertTrue(MICRCodeValidator.isValid("123456789012<"));
assertTrue(MICRCodeValidator.isValid("<123456789012>"));
// 验证以非0数字开头的账户号码
assertTrue(MICRCodeValidator.isValid("1123456789<"));
assertTrue(MICRCodeValidator.isValid("<1123456789>"));
assertTrue(MICRCodeValidator.isValid("91234567890<"));
assertTrue(MICRCodeValidator.isValid("<91234567890>"));
// 验证位数不足或过多的账户号码
assertFalse(MICRCodeValidator.isValid("123456789<"));
assertFalse(MICRCodeValidator.isValid("1234567890123<"));
assertFalse(MICRCodeValidator.isValid("12345<"));
assertFalse(MICRCodeValidator.isValid("123456789012345<"));
// 验证包含非数字字符的账户号码
assertFalse(MICRCodeValidator.isValid("A123456789<"));
assertFalse(MICRCodeValidator.isValid("<A123456789>"));
assertFalse(MICRCodeValidator.isValid("1234567890<A>"));
assertFalse(MICRCodeValidator.isValid("<1234567890>A"));
}
结论
通过上面的实现,我们可以发现使用正则表达式验证MICR代码有着正确、高效、简便的特点。不仅可以进行基本的格式验证,还可以对具体规则进一步进行调整和扩展。当然,正则表达式只是对MICR码验证的一种方法,实际情况下如果需要进行支票付款操作,还需要结合更全面的检测手段和支付渠道进行综合判断。