2008-12-04 42 views
5

如果輸入的字符串看起來像Vehicle Identification Number (VIN),我想進行初步檢查。我知道它是由17個字母和數字,但字母I,O和Q不允許內部VIN,所以我用這個正則表達式:RegularExpressionValidator使用除R​​egex之外的其他味道嗎?

^[0-9A-Z-[IOQ]]{17}$ 

現在,如果我檢查字符串像1G1FP22PXS2100001用的RegularExpressionValidator失敗,但帶有此OnServerValidate事件處理程序的CustomValidator

Regex r = new Regex("^[0-9A-Z-[IOQ]]{17}$"); 
args.IsValid = r.IsMatch(TextBox1.Text); 

很好。

實驗顯示RegularExpressionValidator不支持Character Class Subtraction,但是Regex類沒有。

現在我感興趣爲什麼這兩個.NET類使用不同的正則表達式?它是否有文件記錄?

+0

我只是把鏈接直接放在我的答案中,而不是「隱藏它們」在評論中。 – VonC 2008-12-04 08:52:31

回答

5

RegularExpressionValidator還支持使用JavaScript的客戶端驗證,其中使用了JavaScript Regex引擎。你看到的區別在於JavaScript和.NET正則表達式實現之間的區別。 您可以禁用客戶端驗證,從而強制驗證程序使用.NET正則表達式引擎,並以附加回傳的價格執行。

7

不是一個直接的答案,但只是一個明顯的一句話:

如果不支持某種原因字符類減法,你總是可以作爲一種解決方法使用:

^[0-9A-HJ-NPR-Z]{17}$ 

爲了證明什麼我把這個問題的意見:

文章How to: Validate Against Patterns for ASP.NET Server Controls,不提次在JavaScript客戶端的正則表達式驗證程序不知道「字符類減法」

正如RegularExpressionValidator Class .Net documentation mentionned:

兩個,除非瀏覽器不支持服務器端和客戶端驗證執行客戶端驗證或客戶端驗證被明確禁用(通過將EnableClientScript屬性設置爲false)。

客戶端上的正則表達式驗證實現與服務器上的略有不同。在客戶端上,使用JScript正則表達式語法。
在服務器上,使用System.Text.RegularExpressions..::.Regex語法。
JScript正則表達式語法是System.Text.RegularExpressions..::.Regex語法的子集。
因此,建議您使用JScript正則表達式語法以便在客戶端和服務器上都得到相同的結果。

的該副作用另一個例證(服務器和客戶側之間的不同的正則表達式的口味)在RegularExpressionValidator woes博客條目mentionned。

+0

恕我直言,這不是解決方法,這是做到這一點的唯一方法。我不知道像「字符類減法」這樣的東西甚至存在。或者它在一些非常奇怪的正則表達式? – Tomalak 2008-12-04 07:49:01

相關問題