TextBox控件的要求是接受以下作为有效输入:
RegEx产生了预期的结果(成功验证了3种类型的输入):
"Number of rooms|[0-9]*"
但是,当一位同事问为什么以下无法确认何时指定字符串'房间数'时(第2条要求),我无法提出解释:
"[0-9]*|Number of rooms"
关于为什么在这种情况下交替排序很重要的解释确实非常有见地。
更新:
第二个正则表达式成功匹配控制台应用中的目标字符串“房间数”,如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 :(得分:6)
订单很重要,因为这是Regex引擎试图匹配的订单。
案例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);
// .....
正在检查匹配以及确保匹配的长度是整个字符串。这排除了部分或空的匹配。
答案 1 :(得分:2)
重点是,如果您首先指定空字符串,则开头的[0-9]*
匹配空字符串
如果你指定整个字符串应该是数字,那么它应该工作:
^[0-9]*$|Number of rooms
除非您指定^
和$
,否则表示整个字符串必须匹配,空字符串将在“房间数”的开头匹配“,在那一点上,第二种选择将不会被尝试
我希望这可以在评论中回答你的问题,我不确定它是否清楚......
答案 2 :(得分:2)
您可能想要使用正则表达式Number of rooms|[0-9]+
或[0-9]+|Number of rooms
,因为模式[0-9]*
(带星号)始终匹配至少空字符串(*
表示{{1} },所以“零或更多......”)。