2010-05-20 93 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

相關問題