【问题标题】:How can I get a regex to check that a string only contains alpha characters [a-z] or [A-Z]?如何获得正则表达式来检查字符串是否仅包含字母字符 [a-z] 或 [A-Z]?
【发布时间】:2010-11-02 16:27:44
【问题描述】:

我正在尝试创建一个正则表达式来验证给定的字符串是否只有字母字符 a-z 或 A-Z。字符串最长可达 25 个字母。 (我不确定正则表达式是否可以检查字符串的长度)

示例:
1. "abcdef" = true;
2. "a2bdef" = false;
3 . "333" = false;
4. "j" = true;
5. "aaaaaaaaaaaaaaaaaaaaaaaaaa" = false; //26 个字母

这是我目前所拥有的……但我无法弄清楚它有什么问题

Regex alphaPattern = new Regex("[^a-z]|[^A-Z]");

我认为这意味着该字符串只能包含从 a-z 开始的大写或小写字母,但是当我将它与所有字母的字符串匹配时,它会返回 false...

此外,我们将不胜感激有关使用正则表达式与其他验证方法的效率的任何建议。

【问题讨论】:

    标签: c# asp.net regex verification


    【解决方案1】:
    Regex lettersOnly = new Regex("^[a-zA-Z]{1,25}$");
    
    • ^ 表示“从字符串开头开始匹配”
    • [a-zA-Z] 表示“匹配小写和大写字母 a-z”
    • {1,25} 表示“匹配上一项(字符类,见上)1到25次”
    • $ 表示“仅当光标位于字符串末尾时才匹配”

    【讨论】:

    • 您还需要设置RegexOptions.MultiLine 以阐明^ 和$ 字符的含义。否则,提供的表达式看起来很完美。 +1
    • 不能说我同意这一点。如果它包含多行选项,它将验证一个包含 20 个字母的字符串,换行,然后是一堆随机的非字母字符。相反,我会建议在使用之前 Trim() 字符串。
    • 另外,根据“最多 25”真正 的含义,1 可能希望成为 0 - OP 没有指定 string.Empty 是否有效。跨度>
    • 你不想在这里多行选项;没有它,^ 和 $ 表示整个字符串*的开始和结束(分别),这正是我们想要的。 (*除了 $ 也匹配字符串末尾的换行符之前,yadda yadda ... Grabthar,我希望我们可以重做那个!)
    • 只要使用 \A 和 \z,所有这些多行辩论无论如何都是毫无意义的。
    【解决方案2】:

    我正在尝试创建一个正则表达式来验证给定的字符串是否只有 alpha 字符 a-z 或 A-Z。

    正如许多其他人所指出的那样,使用所谓的“字符类”很容易完成。本质上,这些允许我们指定用于匹配的值范围: (注意:为简化起见,我假设隐含的 ^ 和 $ 锚点将在本文后面解释)

    [a-z] 匹配任何单个小写字母。
    例如:a 匹配,8 不匹配

    [A-Z] 匹配任何单个大写字母。
    例如:A 匹配,a 不匹配

    [0-9] 匹配任何单个数字 0 到 9
    例如:8 个匹配,一个不匹配

    [aeiou] 仅匹配 a 或 e 或 i 或 o 或 u。 例如:o 匹配,z 不匹配

    [a-zA-Z] 匹配任何单个小写或大写字母。 例如:A 匹配,a 匹配,3 不匹配

    这些自然也可以被否定: [^a-z] 匹配任何非小写字母 例如:5 匹配,A 匹配,a 不匹配

    [^A-Z] 匹配任何非大写字母 例如:5 匹配,A 不匹配,a 匹配

    [^0-9] 匹配任何不是数字的东西 例如:5 不匹配,A 匹配,a 匹配

    [^Aa69] 匹配任何东西,只要它不是 A 或 a 或 6 或 9 例如:5 匹配,A 不匹配,a 不匹配,3 匹配

    要查看一些常见的字符类,请访问: http://www.regular-expressions.info/reference.html

    字符串最长可达 25 个字母。 (我不确定正则表达式是否可以检查字符串的长度)

    您绝对可以检查“长度”,但不能以您想象的方式检查。我们使用 {} 来衡量重复,而不是严格意义上的长度:

    a{2} 将两个 a 匹配在一起。
    例如:a 不匹配,aa 匹配,aca 不匹配

    4{3} 将三个 4 匹配在一起。 例如:4 不匹配,44 不匹配,444 匹配,4434 不匹配

    重复有我们可以设置有下限和上限的值:

    a{2,} 将两个或多个 a 匹配在一起。 例如:a 不匹配,aa 匹配,aaa 匹配,aba 不匹配,aaaaaaaa 匹配

    a{2,5} 将两到五个 a 匹配在一起。 例如:a 不匹配,aa 匹配,aaa 匹配,aba 不匹配,aaaaaaaaa 不匹配

    重复扩展到字符类,所以: [a-z]{5} 将任意五个小写字符匹配在一起。 例如:bubba 匹配,Bubba 不匹配,BUBBA 不匹配,asdjo 匹配

    [A-Z]{2,5} 将两到五个大写字符匹配在一起。 例如:bubba 不匹配,Bubba 不匹配,BUBBA 匹配,BUBBETTE 不匹配

    [0-9]{4,8} 将四到八个数字匹配在一起。 例如:bubba 不匹配,15835 匹配,44 不匹配,3456876353456 不匹配

    [a3g]{2} 如果它们一起出现两次,则匹配 a OR 3 OR g。 例如:aa 匹配,ba 不匹配,33 匹配,38 不匹配,a3 不匹配

    现在让我们看看你的正则表达式: [^a-z]|[^A-Z] 翻译:匹配任何东西,只要它不是小写字母或大写字母。

    要修复它以满足您的需求,我们将这样重写它: 第 1 步:删除否定 [a-z]|[A-Z] 翻译:查找任何小写字母或大写字母。

    第 2 步:虽然不是非常需要,但让我们稍微清理一下 OR 逻辑 [a-zA-Z] 翻译:查找任何小写字母或大写字母。与上面相同,但现在只使用一组 []。

    第 3 步:现在让我们指定“长度” [a-zA-Z]{1,25} 翻译:找到任何重复一到二十五次的小写字母或大写字母。

    这就是事情变得时髦的地方。您可能认为您已经在这里完成了,您很可能取决于您使用的技术。

    严格来说,正则表达式 [a-zA-Z]{1,25} 将匹配一行中的一到二十五个大写或小写字母 ANYWHERE

    [a-zA-Z]{1,25} a 匹配,aZgD 匹配,BUBBA 匹配,243242hello242552 MATCHES

    事实上,到目前为止,我给出的每个例子都会做同样的事情。如果那是您想要的,那么您的状态很好,但根据您的问题,我猜您只需要整行上的一到二十五个大写或小写字母。为此,我们转向锚点。锚点允许我们指定那些讨厌的细节:

    ^ 行首
    (我知道,我们之前只是用它来否定,不要让我开始)

    $ 行尾

    我们可以这样使用它们:

    ^a{3} 从行首开始匹配 a 3 次 例如:aaa 匹配,123aaa 不匹配,aaa123 匹配

    a{3}$ 在一行的末尾将 a 匹配 3 次 例如:aaa 匹配,123aaa 匹配,aaa123 不匹配

    ^a{3}$ENTIRE 行中将 a 匹配 3 次 例如:aaa 匹配,123aaa 不匹配,aaa123 不匹配

    请注意,aaa 在所有情况下都匹配,因为从技术上讲,它在行首和行尾都有三个 a。

    因此,对于在一行中查找“最多五个字符”的“单词”,最终的、技术上正确的解决方案是:

    ^[a-zA-Z]{1,25}$

    有趣的是,有些技术隐含地为您在正则表达式中放置了锚点,而有些则没有。您只需测试您的正则表达式或阅读文档以查看您是否有隐式锚点。

    【讨论】:

      【解决方案3】:
      /// <summary>
      /// Checks if string contains only letters a-z and A-Z and should not be more than 25 characters in length
      /// </summary>
      /// <param name="value">String to be matched</param>
      /// <returns>True if matches, false otherwise</returns>
      public static bool IsValidString(string value)
      {
          string pattern = @"^[a-zA-Z]{1,25}$";
          return Regex.IsMatch(value, pattern);
      }
      

      【讨论】:

        【解决方案4】:

        字符串最长可达 25 个字母。 (我不确定正则表达式是否可以检查字符串的长度)

        正则表达式确实可以检查字符串的长度 - 从其他人发布的答案中可以看出。

        但是,当您验证用户输入(例如,用户名)时,我建议您单独进行检查。

        问题是,正则表达式只能告诉你字符串是否匹配。它不会说明为什么它不匹配。文本是否太长或是否包含不允许的字符 - 您无法判断。当程序说:“提供的用户名包含无效字符或太长”时,这远非友好。相反,您应该针对不同的情况提供单独的错误消息。

        【讨论】:

        • 同意。因此,对我来说,这不会产生 2 条,而是 3 条可能的消息:“提供的用户名包含无效字符(仅允许 ..)”、“提供的用户名太长(允许最多 ..)”或“提供的用户名包含无效字符(仅允许使用 ..)并且太长(最多允许使用 ..)”。我非常不喜欢输入验证,它不提供关于可接受输入的任何线索,只会让你从一个错误跑到另一个错误......
        【解决方案5】:

        您使用的正则表达式是[^a-z][^A-Z] 的交替。而表达式[^…] 表示匹配字符集中描述之外的任何字符。

        因此,总体而言,您的表达式意味着匹配除a-z 或除A-Z 之外的任何单个字符。

        但您更需要一个仅匹配 a-zA-Z 的正则表达式:

        [a-zA-Z]
        

        要指定它的长度,用字符串的开头 (^) 和结尾 ($) 锚定表达式,并用 { 描述长度n,m} 量词,表示至少 n 但不超过 m 次重复: p>

        ^[a-zA-Z]{0,25}$
        

        【讨论】:

          【解决方案6】:

          我是否正确理解它只能包含任何一个大写小写字母?

          new Regex("^([a-z]{1,25}|[A-Z]{1,25})$")
          

          在这种情况下,正则表达式似乎是正确的选择。

          顺便说一句,字符类中第一个位置的插入符号(“^”)表示“不是”,所以你的“[^a-z]|[^A-Z]”表示“不是任何小写字母,或者不是任何大写字母”(忽略az 不都是字母)。

          【讨论】:

          • 并且,由于[^az](“除小写ASCII字母以外的任何字符”)描述的集合包括大写字母,而[^AZ]包括小写字母,因此[^az]|[^ AZ] 将匹配任何字符。
          猜你喜欢
          • 2011-04-01
          • 1970-01-01
          • 2013-11-22
          • 2019-11-22
          • 2018-03-16
          • 1970-01-01
          • 2012-08-05
          • 1970-01-01
          • 2012-02-24
          相关资源
          最近更新 更多