2010-05-20 91 views
3

我试图在使用Microsoft VBScript正则表达式5.5(应该与JavaScript正则表达式相同)的VBA代码中运行正则表达式。这个正则表达式(VBScript/JavaScript flavor)有什么问题?

正则表达式:^[0-9A-Z]?[0-9A-Z]{3}[A-Z]?([0-9A-Z]{6})-?([0-9])?$
输入:X123A1234567
比赛:123456

六个字符我感兴趣给出123456的良好匹配,忽略了最后一个(校验)位。完善。 (检查数字被捕获,但它不是我主要关心的。)

但是,当两个可选部分都不存在时(它们的可选),匹配会抓取最后一位数字。

GOOD:

输入:123123456 比赛:123456

没有阿尔法,无校验位。良好的匹配。

GOOD

输入:123A1234567
比赛:123456

留在可选的中间α,取出可选的领先α,在校验位离开,我们仍然得到123456的良好匹配。

GOOD

输入:X1231234567
比赛:123456

留在可选的领先α,取出中间的可选alpha,在校验位离开,我们仍然得到123456的良好匹配。

BAD

输入:1231234567
比赛:234567

取出都是可选的阿尔法,在校验位离开了,我们得到的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])?$

回答

2

如果取出可选的领先α,该1的第一个字符类[0-9A-Z]?相匹配,并且也没有理由因为整个正则表达式匹配放弃它 - 毕竟最后的数字是在您的正则可选。

由于它看起来不是可选的(你只是不想匹配它)删除尾随?,正则表达式应该工作。

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

+0

我认为就是这样。我将不得不验证初始可选字符是否只是字母或字母数字。 – 2010-05-20 16:33:44

+0

就是这样。规格有点朦胧,但我意识到他们使用“字符”仅用于字母,而“数字”仅用于数字。数字是有道理的,但我认为字符是字母数字。 – 2010-05-20 16:42:44

1

如果你真的不想最后一个数字,不让它可选 - 拿那最后?$

+0

它必须是可选的,因为输入数据可能是123123456 - 它只是很好,yeilding“123456”;我会更新这个问题以明确这一点。 在上面的例子中,我不想要最后一个数字 - “123456”是目标; “7”是一个校验位。 – 2010-05-20 16:31:58

+0

我upvoted这个回应,因为,即使它没有解决问题,它使我澄清我的问题[并再次看看正则表达式元素] – 2010-05-20 16:57:40

0

你的正则表达式是真的过于复杂。如果您使用贪婪匹配,您不需要在开始时打扰匹配任何内容。所有你需要的是:

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

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

如果输入数据总是相同的长度,另一个更快的方法来做到这一点将VB6等效的substr。

+0

在原始示例输入数据并不总是相同的长度(所有alphas存在,缺少一些阿尔法,缺少所有阿尔法)。此外,最终的校验位并不总是存在(没有原始示例丢失;我在发布后添加了它)。所以substr不是一个好的候选人。 – 2010-05-20 16:38:32

相关问题