这个正则表达式(VBScript / JavaScript风格)有什么问题?

时间:2010-05-20 16:16:52

标签: javascript regex vba vb6 vbscript

我正在尝试在使用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.htmlhttp://www.regular-expressions.info/vbscriptexample.html上的正则表达式测试人员。

我想念的是什么?当两个可选的alpha都丢失时,如何让正则表达式忽略最后一位数?正则表达式用于提供查找系统,因此无论输入数据采用何种格式,我们都可以匹配完整的值。

更新:以上示例均未包含​​连字符(在正则表达式中显示)。带连字符和校验位的输入数据始终匹配。

更新:正在使用正则表达式,感谢以下建议(谢谢!):

正则表达式:^[A-Z]?[0-9]{3}[A-Z]?([0-9]{6})-?([0-9])?$

3 个答案:

答案 0 :(得分:2)

如果你拿出可选的前导alpha,1匹配第一个字符类[0-9A-Z]?并且没有理由放弃它,因为整个正则表达式匹配 - 在你的所有最后一个数字是可选的正则表达式。

因为它似乎不是可选的(你只是不想匹配它)掉落尾随?,正则表达式应该有用。

或者制作正则表达式[A-Z]?的第一部分,以便它永远不会匹配数字 - 如果这符合您的规则。

答案 1 :(得分:1)

如果你真的不想要最后一位数字,请不要选择它 - 在?之前取出$

答案 2 :(得分:0)

你的正则表达式真的太复杂了。如果你使用贪心匹配,你不需要在开始时打扰任何东西。您所需要的只是:

([0-9A-Z]{6})\d$

我也不确定你是否需要 - ?您的输入数据都没有表明它。 (但你可以添加它)

如果输入数据的长度始终相同,那么更快的方法是VB6相当于substr。