为什么在此RegEx中的订单重要?

时间:2012-04-20 15:06:20

标签: asp.net .net regex

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

  1. 一系列数字。
  2. 文字字符串'房间数'。
  3. 根本没有价值(留空)。根本不指定值应该允许RegularExpressionValidator传递。
  4. 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" />
    

3 个答案:

答案 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} },所以“零或更多......”)。