【问题标题】:Help me generate this regex帮我生成这个正则表达式
【发布时间】:2011-08-31 16:25:09
【问题描述】:

我一直在尝试使用正则表达式,但似乎无法正常工作。我正在尝试将正则表达式与 asp.net RegularExpressionValidator 一起使用。我想要它做的是基本上只允许前导和尾随空格。

所以,

"hello "                 // would not work.
"hello my name is"       // would work.

但在我所有的尝试中,无论我输入什么,它都说输入错误。

这是我使用的:

^\s[a-z]+\s$

有人可以提供一个有效的吗?

另外,当有人说正则表达式返回匹配项时,这意味着什么?

编辑:

我已经尝试了线程中的所有解决方案,但没有一个对我有用。也许这是其他错误而不是正则表达式?以下是相关代码:

                            <InsertItemTemplate>
                            <asp:TextBox CssClass="tbUpdateSummary" TextMode="MultiLine" Text='<%# Bind("updateSummary") %>'
                                ID="tbUpdateSummaryInsert" runat="server"></asp:TextBox>
                            <asp:RequiredFieldValidator ID="valUpdateSummaryInsert1" runat="server" Display="None"
                                ControlToValidate="tbUpdateSummaryInsert" ErrorMessage="Update summary must not be empty.">
                            </asp:RequiredFieldValidator>
                            <asp:RegularExpressionValidator ValidationExpression="^\s+|\s$" ID="valUpdateSummaryEdit2"
                                runat="server" Display="None" ControlToValidate="tbUpdateSummaryInsert"  ErrorMessage="Update summary must not contain leading or trailing spaces."> </asp:RegularExpressionValidator>
                            <%--Put c# code to validate length (max 200)--%>
                            <asp:CustomValidator></asp:CustomValidator>
                        </InsertItemTemplate>

^[^\s].+[^\s]$

【问题讨论】:

  • 我假设您在提交后不想要前导/尾随空格。因此,当提交发生时(如在btn_Click method 中),仅在TextBox 的文本上使用String.Trim()(而不是使用正则表达式)可能更有意义。只是一个想法
  • 在任何输入上调用 trim() 是否是可接受的解决方案?
  • 是的,但我需要学习如何使用正则表达式,因为我还需要测试其他内容。
  • 我发现这个工具非常适合学习正则表达式:radsoftware.com.au/regexdesigner

标签: c# asp.net regex validation


【解决方案1】:

鉴于RegularExpressionValidator 正在寻找与良好输入相匹配的匹配项,而不是相反:

以下正则表达式将匹配前面或后面没有空格的任何内容:

^(?!\s+).+(?<!\s+)$

尽管问题的 cmets 中提到的 Trim 选项似乎是一种更明智的方法。

【讨论】:

  • +1,但您不需要在环视内使用量词; (?!\s)(?&lt;!\s) 工作正常。如果第一个(或最后一个)字符是空格,那么再看也没有意义,是吗?
  • 确实如此。将留在原地,以便您的评论有意义!
  • 好主意。这是一个非常常见的错误,虽然它可能永远不会产生任何实际影响,但仅仅考虑它可能会“欺骗”一个人进入不同的视角,从而意外地获得更深入的理解。在理解正则表达式时,相信我,每一点都有帮助! ☺
【解决方案2】:

试试这个正则表达式,它应该匹配开头和结尾没有空格的所有内容

^[^\s].+[^\s]$

【讨论】:

  • +1,我敢打赌这正是他遇到的问题,很好。
  • 只有在输入中同时存在前导和尾随空白字符时才会匹配。 “你好”不匹配。
  • 将与前面/后面的双空格分开
  • @spender 总是让你忘记一些事情 :) 你现在怎么想?
  • 不,本来就很好。您只关心第一个和最后一个字符不是空格,^[^\s].+[^\s]$ 保证这一点。但是,它也保证至少有三个字符,我在 OP 的要求中没有看到这一点。 ://
【解决方案3】:

正则表达式验证器是一个肯定的测试。您需要测试三个案例

  • 长度为零的输入。
  • 长度为 1 的输入
  • 输入长度> 1

因为您在输入控件上有一个Required 验证器,所以第一种情况不会发生。以下香草正则表达式应该可以工作:

^[^\s]([.\n]*[^\s])?$

您可以将其解读为有效输入包括:

  • 行首,后跟,
  • 正好是 1 个非空白字符,后跟
  • 一个可选的子表达式,由
    • 零个或多个任意字符,包括 LF(默认情况下,元字符 . 匹配任何字符 除了 LF),后跟
    • 正好 1 个非空白字符, 其次,
  • 行尾

由于您的示例中有一个多行编辑控件,因此在中间使用 .* 而不是我使用的 [.\n]* 将导致匹配在找到的第一个 LF 字符处终止。有关 .Net 正则表达式字符类的详细信息,请参阅http://msdn.microsoft.com/en-us/library/az24scfc.aspx#character_classes

[编辑注释]

测试表明,出于某种原因,.Net 不喜欢包含.[] 字符类(或者将其视为文字句点字符)。这个正则表达式有效:

^([^\s])((.|\n)*[^\s])$

但它允许尾随换行符。

但是,这个正则表达式更好(对于更好的一些定义)。它 (A) 不涉及回溯,并且 (B) 不允许尾随换行符:

^[^\s]+(\s+[^\s]+)*$
  • 行首,后跟
  • 1 个或多个非空白字符,后跟
  • 零次或多次重复
    • 1 个或多个空格字符,后跟
    • 1 个或多个非空白字符, 其次,
  • 行尾。

祝你好运!

【讨论】:

  • 它仍然会在除 null 之外的任何输入上爆发。为什么它们都不工作?不可能他们都错了。我认为我不应该使用正则表达式并验证服务器端的所有内容....
  • @TheGateKeeper:见上面的附录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多