2012-05-02 54 views
1

我肯定在這裏錯過了一些東西,因爲我期望的工作方式相同,工作方式不同。RegularValidator與Regex.Match在CustomValidator中

假設下面的RegularExpressionValidator語法

<asp:RegularExpressionValidator runat="server" ID="rxEmail" ControlToValidate="txEmail" 
        ValidationExpression="<%$ appsettings:rxEmail %>" Text="*" /> 

和以下的CustomValidator語法/代碼

<asp:CustomValidator ID="cvEmail" runat="server" Text="*" onServerValidate="validateContactFormat" /> 

Sub validateContactFormat(ByVal sender As Object, ByVal args As ServerValidateEventArgs) Handles cvContactFormat.ServerValidate 
     Dim emailRegEx As Regex = New Regex(ConfigurationManager.AppSettings("rxEmail")) 
     args.IsValid = emailRegEx.IsMatch(txEmail.Text) 

End Sub 

web.config中保持的表達是

[\w-][email protected]([\w-]+\.)+[\w-]+ 

這被認爲是簡單,並排除了最明顯的問題,而不是太照片KY。

Anywho,給定輸入[email protected] - RegularExpressionValidator失敗,但CustomValidator通過。其他情況按預期工作..都通過[email protected],但會失敗blah.com。可能還有其他問題,但這是我注意到的一個問題。

我猜CustomValidator中的代碼和RegularExpressionValidator在'幕後'會產生什麼不一樣 - 但究竟有什麼區別,爲什麼我會看到我所看到的?

非常感謝!

回答

1
[email protected] 

@之前包含一個點。該點與[\w-]+不匹配。

RegularExpressionValidator根據正則表達式檢查整個字符串,並且正確地失敗。

的的CustomValidator(使用Regex.IsMatch())檢查是否匹配(與[email protected]成功,再次正確)。

爲了確保兩個相同的行爲,用錨環繞你的正則表達式:

"^(?:" + myOldRegex + ")$" 
+0

精彩的回答:)大加讚賞 –

+0

@TablooQuijico:不客氣,你是不是成爲第一個被.NET團隊的決定搞糊塗了,用IsMatch()代替了Search()或Find()或IsSubmatch(),或者任何並不意味着完全匹配的東西。 –