asp.net - 为什么顺序在这个正则表达式中很重要并且交替?

标签 asp.net .net regex

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

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

以下正则表达式产生了所需的结果(成功验证了 3 种类型的输入):

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

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

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

解释为什么交替顺序在这种情况下很重要,确实是非常有洞察力的。

更新:

第二个正则表达式成功匹配控制台应用程序中的目标字符串“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" />

最佳答案

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

情况1:房间数量|[0-9]*

在这种情况下,正则表达式引擎将首先尝试匹配文本“Number of room”。如果失败,将尝试匹配数字或不匹配任何内容。

情况2:[0-9]*|房间数量:

在这种情况下,引擎将首先尝试匹配数字或不匹配任何内容。但没有什么总是匹配。在这种情况下,它永远不需要尝试“房间数”

这有点像 || C# 中的运算符。一旦左侧匹配,右侧将被忽略。

更新: 回答你的第二个问题。它的行为与正则表达式验证器不同,因为它不仅仅检查匹配。

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

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

关于asp.net - 为什么顺序在这个正则表达式中很重要并且交替?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10248776/

相关文章:

c# - 如何在 C++/CLI 中将事件处理程序分配给事件?

java,正则表达式,需要在正则表达式中转义反斜杠

c# - 如何设置 asp :HyperLink href to "mailto:abc@hotmail.com" in .net c#

asp.net - IIS 8.5 中的尾部斜杠问题

.net - nuget 的程序集被 GAC 的程序集覆盖

c# - 在 C# 中实现生产者/消费者模式

c# - 在 ASP.NET C# 中将 byte[] 流式传输到图像

asp.net - asp :button disappears in IE7, 但留在 IE8 中。为什么?

ios - Swift 正则表达式查找全部

c# - 最佳选择如何在 C# 中使用 RegEx 或 LINQ 查找字符串中的最后 2 位数字?