2012-04-20 51 views
3

TextBox控件的要求是接受以下爲有效輸入:爲什麼訂單在這個正式交易中重要?

  1. 數字序列。
  2. 字符串'房間數'。
  3. 根本沒有值(空白)。根本不指定值應允許RegularExpressionValidator傳遞。

繼正則表達式得到需要的結果(成功驗證了3種類型的輸入):

"Number of rooms|[0-9]*" 

但是,我不能拿出一個解釋,當一個同事問,爲什麼下面無法驗證指定字符串「客房數量」時(要求#2):

"[0-9]*|Number of rooms" 

,爲什麼的交替事項在這種情況下,順序將是非常有見地的的確是一個解釋。

UPDATE:

第二個正則表達式匹配成功目標字符串「客房數量」中的控制檯應用程序如圖所示here。但是,當輸入爲「房間數量」時,在aspx標記中使用相同的表達式不匹配。以下是相關的aspx標記:

<asp:TextBox runat="server" ID="textbox1" > 
</asp:TextBox> 

<asp:RegularExpressionValidator ID="RegularExpressionValidator1" 
EnableClientScript="false" runat="server" ControlToValidate="textbox1" 
ValidationExpression="[0-9]*|Number of rooms" 
ErrorMessage="RegularExpressionValidator"></asp:RegularExpressionValidator> 

<asp:Button ID="Button1" runat="server" Text="Button" /> 
+0

對於數字序列,您應該使用'\ d +'或'[0-9] +',而不是'[0-9] *',因爲這意味着任何**數字(包括**沒有**)。 – Oded 2012-04-20 15:08:15

+1

在一種情況下,您有「房間數量」,而在另一個「行數」中。這是一個錯字嗎? – 2012-04-20 15:09:25

+0

@Oded:但它不會匹配空字符串按照第3項。 – 2012-04-20 15:10:24

回答

6

該命令很重要,因爲這是正則表達式引擎將嘗試匹配的順序。

案例1:Number of rooms|[0-9]*

在這種情況下,正則表達式引擎將首先嚐試匹配文本「房號」。如果這個失敗,然後嘗試匹配數字或什麼都不是。

案例2:[0-9]*|Number of rooms

在這種情況下,發動機將首先嚐試匹配數字或沒有。但總是匹配。在這種情況下,它永遠不需要嘗試「房間數量」

這是有點像||。運算符在C#中。一旦左側匹配右側將被忽略。

更新: 要回答你的第二個問題。它的行爲與RegularExpressionValidator有所不同,因爲這不僅僅是檢查匹配。

// ..... 
Match m = Regex.Match(controlValue, ValidationExpression); 
return(m.Success && m.Index == 0 && m.Length == controlValue.Length); 
// ..... 

它檢查匹配以及確保匹配的長度是整個字符串。這排除了部分或空的匹配。

+0

謝謝。但是,如果沒有東西會永遠匹配,並且'它永遠不需要嘗試'房間數'',那麼爲什麼在指定字符串'房間數'時卻無法匹配? – Abhinav 2012-04-20 15:21:21

+0

由於空字符串將匹配「房間數量」的開頭。帶*的正則表達式總是可以匹配0個東西。 – 2012-04-20 15:33:13

+0

如果字符串「房間數量」的開始被證明是空字符串的「匹配」,爲什麼RegEx失敗? – Abhinav 2012-04-20 15:57:45

2

重點在於如果您先指定[0-9]*,則開始時會匹配空字符串。
如果指定整個字符串應該是數字,那麼它應該工作:

^[0-9]*$|Number of rooms 

除非指定^$,以表明整個字符串必須匹配,一個空字符串將在「房間數量」開始時匹配,並且在此時第二種選擇將不被嘗試。
我希望這回答在評論你的問題,我不知道,如果是明確的......

+0

謝謝。這樣可行!然而,即使它試圖匹配輸入字符串「房間數量」不是這種情況的空字符串,爲什麼它不嘗試其他替代方法? – Abhinav 2012-04-20 15:27:59

+0

這似乎是一個asp.net特定的問題,似乎困擾着我對正則表達式的理解。檢出更新後的問題 – Abhinav 2012-04-20 17:13:21

2

你可能想用正則表達式Number of rooms|[0-9]+[0-9]+|Number of rooms,因爲圖案[0-9]*(帶星號)將始終與至少空字符串(*意味着{0,},所以「零個或多個......」)。

相關問題