TextBox控件的要求是接受以下作为有效输入:
>一系列数字.
>文字字符串’房间数’.
>根本没有价值(留空).根本不指定值应该允许RegularExpressionValidator传递.
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" />
解决方法
该顺序很重要,因为这是Regex引擎尝试匹配的顺序.
案例1:房间数量| [0-9] *
在这种情况下,正则表达式引擎将首先尝试匹配文本“房间数”.如果失败将尝试匹配数字或什么都不匹配.
案例2:[0-9] * |房间数量:
在这种情况下,引擎将首先尝试匹配数字或不匹配.但没有什么能永远匹配.在这种情况下,它永远不需要尝试“房间数量”
这有点像|| C#中的运算符.一旦左侧匹配,右侧将被忽略.
更新:
回答你的第二个问题.它与RegularExpressionValidator的行为不同,因为这不仅仅是检查匹配.
// ..... Match m = Regex.Match(controlValue,ValidationExpression); return(m.Success && m.Index == 0 && m.Length == controlValue.Length); // .....
它正在检查匹配以及确保匹配的长度是整个字符串.这排除了部分或空的匹配.