2010-09-08 112 views
1

我有我的網頁之一以下的RegularExpressionValidator:驗證拋出錯誤

<asp:RegularExpressionValidator ID="RegularExpressionValidator2" runat="server" 
             ControlToValidate="InKindTextBox" 
             ErrorMessage="The value entered for 'Cash' must be in a number format. Examples: 500.00, 500, $500, $50,000 or $500.00" 
             ValidationExpression="(?n:(^\$?(?!0,?\d)\d{1,3}(?=(?<1>,)|(?<1>))(\k<1>\d{3})*(\.\d\d)?)$)" > 

但是,當它試圖驗證它拋出下面的錯誤從我的動態頁面JS一個。

alt text

當我通過​​運行這個正則表達式,它工作正常。我在這裏做錯了什麼?

回答

2

JavaScript使用與.NET不同的regexp語法。參見例如,this page。從MSDN的RegularExpressionValidator page

報價:

的正則表達式驗證 實現在客戶端上比在服務器上略有不同 。在 客戶端,使用JScript正則表達式 語法。在服務器上,使用 System.Text.RegularExpressions.Regex 語法。由於JScript正 表達式語法是 System.Text.RegularExpressions.Regex 語法的子集,所以建議的JScript 正則表達式語法中 順序使用,以產生 在客戶端和服務器上均相同的結果。

更新:正則表達式的口味在許多語言,包括.NET和JavaScript可以發現here徹底的比較。

更新2: 下面是應該使用JScript的正則表達式兼容驗證貨幣輸入一個正則表達式:

     <asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" 
            ControlToValidate="CashTextBox" ValidationGroup="vld_Insert" 
            ErrorMessage="The value entered for 'Cash' must be in a number format. Examples: 5000, 5000.00, 5,000 or $5,000.00" 
            ValidationExpression="^\s*\$?\s*(?!\d{4,},)(\d|\d{1,3},(?=\d{3})(?!\d{4}))*(\.\d{1,2})?\s*$"> 
+0

你知道如何我正則表達式轉換爲jScrpt正則表達式的任何機會呢? :) – 2010-09-08 17:01:01

+0

更新了一個比較頁面的鏈接 - 好幫手讓你的正則表達式正確翻譯。另外,檢查他們的正則表達式工具。他們的powergrep是一個非常有用的應用程序。 – 2010-09-08 19:17:02

3

我覺得你的正則表達式是太複雜,反正。我會用更簡單的東西像

^[1-9]\d*(\.\d*)?$ 

,說沒有前導0,小數點前至少一個數字,和一個可選的小數點後面的數字。

編輯

^\$?([1-9]\d?\d?((,\d{3})*|(\d{3})*)|0?)(\.\d*)?$ 

爲了測試它

var r = /^\$?([1-9]\d?\d?((,\d{3})*|(\d{3})*)|0?)(\.\d*)?$/; 
var shouldMatch = ["$30,000.00", "30,000.00", "9,000.00", "9000", "1", ".12"]; 
var shouldntMatch = ["30,000000.00", "1.00c", "19,00.00", "$30,00"]; 
function test1() { 
    for (var i in shouldMatch) { 
    if (!r.exec(shouldMatch[i])) { 
     alert(shouldMatch[i]); 
     return; 
    } 
    } 
} 
function test2() { 
    for (var i in shouldntMatch) { 
    if (r.exec(shouldntMatch[i])) { 
     alert(shouldntMatch[i]); 
     return; 
    } 
    } 
} 
test1(); 
test2(); 
+0

我想接受美元符號和逗號的輸入。你太簡單了。 – 2010-09-08 16:58:19

+0

在這種情況下,您需要更改錯誤消息。如果你描述一下你打算更好一點的格式,我們可以弄清楚。 – 2010-09-08 17:00:23

+0

根據您的請求更改錯誤消息。我想接受有效的美國投資,在正確的地方使用美元符號和逗號。 $ 3,000 =有效。$ 30,00 =無效 – 2010-09-08 17:05:45