我正在尝试在使用Microsoft VBScript Regular Expressions 5.5的VBA代码中运行正则表达式(应该与JavaScript正则表达式相同)。
正则表达式:^[0-9A-Z]?[0-9A-Z]{3}[A-Z]?([0-9A-Z]{6})-?([0-9])?$
输入:X123A1234567
匹配:123456
我感兴趣的六个字符与123456
匹配良好,忽略了最后一个(校验)数字。完善。 (记录数字被捕获,但这不是我的主要关注点。)
但是当两个可选部分都消失了(他们 可选)时,这个匹配抓住了最后一个数字。
GOOD:
输入:123123456
匹配:123456
没有alphas,没有校验位。很好的比赛。
GOOD
输入:123A1234567
匹配:123456
留在可选的中间alpha,取出可选的前导alpha,留下校验位,我们仍然得到123456
的良好匹配。
GOOD
输入:X1231234567
匹配:123456
留在可选的前导alpha中,取出中间的可选alpha,留下校验位,我们仍然可以很好地匹配123456
。
BAD
输入:1231234567
匹配:234567
取出两个可选的alphas,留下校验位,我们得到234567
的错误匹配。
查看http://www.regular-expressions.info/javascriptexample.html或http://www.regular-expressions.info/vbscriptexample.html上的正则表达式测试人员。
我想念的是什么?当两个可选的alpha都丢失时,如何让正则表达式忽略最后一位数?正则表达式用于提供查找系统,因此无论输入数据采用何种格式,我们都可以匹配完整的值。
更新:以上示例均未包含连字符(在正则表达式中显示)。带连字符和校验位的输入数据始终匹配。
更新:正在使用正则表达式,感谢以下建议(谢谢!):
正则表达式:^[A-Z]?[0-9]{3}[A-Z]?([0-9]{6})-?([0-9])?$
答案 0 :(得分:2)
如果你拿出可选的前导alpha,1
匹配第一个字符类[0-9A-Z]?
并且没有理由放弃它,因为整个正则表达式匹配 - 在你的所有最后一个数字是可选的正则表达式。
因为它似乎不是可选的(你只是不想匹配它)掉落尾随?
,正则表达式应该有用。
或者制作正则表达式[A-Z]?
的第一部分,以便它永远不会匹配数字 - 如果这符合您的规则。
答案 1 :(得分:1)
如果你真的不想要最后一位数字,请不要选择它 - 在?
之前取出$
答案 2 :(得分:0)
你的正则表达式真的太复杂了。如果你使用贪心匹配,你不需要在开始时打扰任何东西。您所需要的只是:
([0-9A-Z]{6})\d$
我也不确定你是否需要 - ?您的输入数据都没有表明它。 (但你可以添加它)
如果输入数据的长度始终相同,那么更快的方法是VB6相当于substr。