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

什么';这个正则表达式(VBScript/JavaScript风格)有什么问题?,javascript,regex,vba,vb6,vbscript,Javascript,Regex,Vba,Vb6,Vbscript,我正在尝试在VBA代码中运行一个正则表达式,该代码使用Microsoft VBScript正则表达式5.5(应该与JavaScript正则表达式相同) 正则表达式:^[0-9A-Z]?[0-9A-Z]{3}[A-Z]([0-9A-Z]{6})-?([0-9])?$ 输入:X123A1234567 匹配:123456 我感兴趣的六个字符很好地匹配了123456,忽略了最后一个(检查)数字。完美的(支票数字已被捕获,但这不是我主要关心的问题。) 但当两个可选部分都消失(它们是可选的)时,匹配项将获取

我正在尝试在VBA代码中运行一个正则表达式,该代码使用Microsoft VBScript正则表达式5.5(应该与JavaScript正则表达式相同)

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

输入:
X123A1234567

匹配:
123456

我感兴趣的六个字符很好地匹配了
123456
,忽略了最后一个(检查)数字。完美的(支票数字已被捕获,但这不是我主要关心的问题。)

但当两个可选部分都消失(它们是可选的)时,匹配项将获取最后一个数字

好:

输入:
123456
匹配:
123456

没有字母,没有校验数字。很般配

输入:
123A1234567

匹配:
123456

保留可选的中间alpha,去掉可选的前导alpha,保留检查数字,我们仍然得到了
123456
的良好匹配

输入:
X1231234567

匹配:
123456

保留可选的前导字母,去掉中间的可选字母,保留检查数字,我们仍然得到一个很好的匹配
123456

坏的

输入:
1231234567

匹配:
234567

取出两个可选字母,保留检查数字,我们得到一个不匹配的
234567

请查看或上的正则表达式测试程序

我错过了什么,在这里?当两个可选字母都丢失时,如何使正则表达式忽略最后一个数字?正则表达式用于为查找系统提供数据,因此无论输入数据的格式如何,我们都可以匹配到完整的值

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

更新:工作正则表达式,感谢以下建议(谢谢!):


正则表达式:
^[A-Z]?[0-9]{3}[A-Z]?([0-9]{6})-?([0-9])?$
如果你真的不想要最后一个数字,不要让它成为可选的-去掉
$/code>

你的正则表达式实在太复杂了。如果使用贪婪匹配,那么一开始就不需要麻烦匹配任何东西。您所需要的只是:

([0-9A-Z]{6})\d$
我也不确定你是否需要-?。您的输入数据中没有一个显示它。(但你可以加上它)


如果输入数据的长度始终相同,则执行此操作的更快方法是VB6等效于substr。

如果去掉可选的前导字母,则
1
匹配第一个字符类
[0-9A-Z]?
并且没有理由放弃它,因为整个正则表达式匹配-毕竟最后一个数字在正则表达式中是可选的

因为它看起来不是可选的(您只是不想匹配它),所以删除尾部的
,正则表达式应该可以工作


或者将正则表达式的第一部分设置为
[A-Z]?
,这样它就永远不会匹配数字-如果符合您的规则的话。

它必须是可选的,因为输入数据可能是123456-匹配得很好,即“123456”;我将更新这个问题,使之明确。在上面的例子中,我不希望最后一个数字--“123456”是目标;“7”是一个校验数字。我对这个回答投了更高的票,因为尽管它没有解决问题,但它让我澄清了我的问题[再看看正则表达式元素],我认为这就是答案。我必须验证初始可选字符是字母还是字母数字。就是这样。规格有点模糊,但我意识到它们只使用“字符”表示字母,“数字”表示数字。数字是有意义的,但我认为字符是字母数字的。在原始示例中,输入数据的长度并不总是相同的(所有字母都存在,一些字母缺失,所有字母缺失)。此外,最后的检查数字并不总是存在(没有丢失的原始示例;我在您发布后添加了它)。所以substr不是一个好的候选人。