我正在尝试在使用Microsoft VBScript正则表达式5.5(应与JavaScript正则表达式相同)的VBA代码中运行正则表达式.
正则表达式:^ [0-9A-Z]?[0-9A-Z] {3} [A-Z]?([0-9A-Z] {6})-?([0-9])?$
输入:X123A1234567
匹配:123456
我感兴趣的六个字符可以很好地匹配123456,而忽略最后一个(校验)数字.完善. (支票号码被捕获,但这对我来说不是主要的问题.)
但是当两个可选部分都消失了(它们是可选的)时,比赛将抓住最后一位.
好:
输入:123123456
匹配:123456
没有字母,没有校验位.很好的搭配.
好
输入:123A1234567
匹配:123456
保留可选的中间字母,取出可选的前导字母,保留校验位,我们仍然获得很好的匹配123456.
好
输入:X1231234567
匹配:123456
保留可选的前导Alpha,取出中间的可选Alpha,保留校验位,我们仍然得到很好的匹配123456.
坏
输入:1231234567
符合:234567
取出两个可选的字母,保留校验位,我们得到的匹配不良是234567.
看看http://www.regular-expressions.info/javascriptexample.html或http://www.regular-expressions.info/vbscriptexample.html上的正则表达式测试器.
我在想什么?当两个可选字母都缺失时,如何使正则表达式忽略最后一位?正则表达式用于提供查询系统,因此无论输入数据采用哪种格式,我们都可以匹配一个完整的值.
更新:以上示例都不包含连字符(在正则表达式中显示).带连字符和校验位的输入数据始终匹配.
更新:正则表达式正常运行,这要归功于以下建议(谢谢!):
正则表达式:^ [A-Z]?[0-9] {3} [A-Z]?([0-9] {6})-?([0-9])?$
解决方法:
如果删除可选的前导字母,则1匹配第一个字符类[0-9A-Z]?并且没有理由放弃它,因为整个正则表达式都匹配-毕竟,正则表达式中的最后一位是可选的.
由于它似乎不是可选的(您只是不想匹配它),请删除结尾的?,并且正则表达式应该起作用.
还是制作正则表达式的第一部分[A-Z]?因此它永远不会与数字匹配-如果符合您的规则.