8

TextBox 控件的要求是接受以下作为有效输入:

  1. 一串数字。
  2. 文字字符串“房间数”。
  3. 没有任何价值(留空)。根本不指定值应该允许 RegularExpressionValidator 通过。

遵循 RegEx 产生了预期的结果(成功验证了 3 种类型的输入):

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

但是,当一位同事询问为什么在指定字符串“房间数”时以下内容无法验证(要求#2)时,我无法做出解释:

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

关于为什么在这种情况下交替的顺序很重要的解释确实非常有见地。

更新:

第二个正则表达式成功匹配控制台应用程序中的目标字符串“房间数”,如下所示。但是,当输入为“房间数”时,在 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" />
4

3 回答 3

9

顺序很重要,因为这是正则表达式引擎将尝试匹配的顺序。

情况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); 
// .....

它正在检查匹配并确保匹配的长度是整个字符串。这排除了部分匹配或空匹配。

于 2012-04-20T15:12:39.673 回答
2

您可能想使用正则表达式Number of rooms|[0-9]+or [0-9]+|Number of rooms,因为模式[0-9]*(带星号)将始终至少匹配空字符串(*表示{0,},因此“零或更多......”)。

于 2012-04-21T00:59:44.600 回答
2

关键是,[0-9]*如果您首先指定,则开头匹配空字符串。
如果您指定整个字符串应该是数字,那么它应该可以工作:

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

除非您指定^and$来表示整个字符串必须匹配,否则将在“房间数”的开头匹配一个空字符串,此时将不会尝试第二种选择。
我希望这能在评论中回答您的问题,我不确定是否清楚...

于 2012-04-20T15:13:11.490 回答