如何使用正则表达式检查一个字符串是否只包含字母[a-z]或[A-Z]?

17

我正在尝试创建一个正则表达式,以验证给定的字符串仅包含字母a-z或A-Z。该字符串最多可以长达25个字母。(我不确定正则表达式能否检查字符串长度)

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

这是到目前为止我拥有的...但我想不出它有什么问题

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

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

此外,如何高效使用正则表达式进行验证,与其他验证方法相比的建议将不胜感激。

6个回答

38
Regex lettersOnly = new Regex("^[a-zA-Z]{1,25}$");
  • ^ 表示“从字符串开头开始匹配”
  • [a-zA-Z] 表示“匹配小写和大写字母 a-z”
  • {1,25} 表示“匹配前面的项目(字符类,见上文)1到25次”
  • $ 表示“仅在光标位于字符串末尾时进行匹配”

2
您还需要设置 RegexOptions.MultiLine 以澄清 ^ 和 $ 字符的含义。否则,提供的表达式看起来是完美的。+1 - Cerebrus
我不能同意这个观点。如果它包括多行选项,它将验证一个带有20个字母的字符串,然后是一堆随机的非字母字符。相反,我建议在使用之前修剪字符串。 - Blixt
此外,根据“最多25个”到底意味着什么,那个1可能需要变成0——OP没有指定string.Empty是否有效。 - AakashM
3
这里不需要使用多行选项;没有多行选项时,^和$分别表示整个字符串的开头和结尾,这正是所需的。 (*除了$还匹配字符串末尾的换行符,等等...天哪,我希望我们可以重新开始!) - Alan Moore
只需使用\A和\z,所有这些多行辩论都没有意义。 - Peter Boughton

19
我正在尝试创建一个正则表达式来验证给定字符串只有a-z或A-Z的字母字符。可以使用所谓的"字符类"轻松完成这个任务。基本上,它们允许我们指定一个值范围进行匹配: (注意:为了简化,我假设隐含的^和$锚点,这些锚点在本帖子后面会解释)
[a-z] 匹配任何单个小写字母。 例如:a匹配,8不匹配。
[A-Z] 匹配任何单个大写字母。 例如:A匹配,a不匹配。
[0-9] 匹配任何单个数字零到九 例如:8匹配,a不匹配。
[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 不匹配,aaaaaaaaa 匹配

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或3或g。 例如:aa匹配,ba不匹配,33匹配,38不匹配,a3不匹配。
现在让我们看看你的正则表达式: [^a-z]|[^A-Z] 翻译:只要不是小写字母或大写字母,就匹配任何内容。
为了使其满足您的需求,我们将像这样重新编写它: 步骤1:删除否定。 [a-z]|[A-Z] 翻译:找到任何小写字母或大写字母。
步骤2:虽然不是必需的,但我们可以稍微清理一下OR逻辑。 [a-zA-Z] 翻译:找到任何小写字母或大写字母。与上面相同,但现在只使用单个[]。
第三步:现在让我们指定“长度” [a-zA-Z]{1,25} 翻译:查找任何小写字母或大写字母重复一到二十五次。
这是有点棘手的地方。你可能认为你已经完成了,取决于你使用的技术,你可能真的完成了。
严格来说,正则表达式 [a-zA-Z] {1,25} 将匹配一到二十五个大写或小写字母在任何地方在一行上: [a-zA-Z] {1,25} 一个匹配,aZgD匹配,BUBBA匹配,243242hello242552 匹配 事实上,到目前为止我给出的每个示例都将执行相同的操作。如果这是你想要的,那么你就做得很好,但根据你的问题,我猜你只想要整行中的一到二十五个大写或小写字母。为此,我们转向锚点。锚允许我们指定那些令人讨厌的细节: ^ 行的开头
(我知道,我们刚刚在否定中使用了它,不要让我开始) $ 行的结尾
我们可以这样使用它们: ^ a {3} 从行的开头匹配三次a 例如:aaa匹配,123aaa不匹配,aaa123匹配 a {3} $ 在行的末尾匹配三次a 例如:aaa匹配,123aaa匹配,aaa123不匹配

^a{3}$ 匹配整行中三个a连在一起的情况 例如:aaa匹配,123aaa不匹配,aaa123不匹配

需要注意的是,因为aaa在行首和行尾都有三个a,所以在所有情况下都会匹配。

因此,找到“长度最长为五个字符”的“单词”的最终、技术上正确的解决方案应该是:

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

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


7
/// <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);
}

6
该字符串的长度可以达到25个英文字母。(我不确定正则表达式能否检查字符串的长度)
正则表达式确实可以检查字符串的长度 - 正如其他人发布的答案所示。
然而,当您在验证用户输入(例如用户名)时,我建议单独进行该检查。
问题在于,正则表达式只能告诉您字符串是否与其匹配。它不会告诉您为什么没有匹配。文本过长还是包含了不允许的字符 - 您无法判断。当程序说“提供的用户名包含无效字符或太长”时,这远非友好。相反,您应针对不同情况提供单独的错误消息。

3
同意。对我来说,这将产生三个可能的信息,而不是两个:“提供的用户名包含无效字符(仅允许使用..)”,“提供的用户名过长(最多允许使用..)”或“提供的用户名包含无效字符(仅允许使用..)并且过长(最多允许使用..)”。我强烈反对输入验证不提供有关可接受输入的线索,只会让你从一个错误跑到另一个错误...... - Arjan

4
你所使用的正则表达式是 [^a-z][^A-Z] 的交替。而表达式 [^…] 的意思是匹配除了字符集中描述的字符以外的任何字符。
因此,你的整个表达式的意思是匹配除了 a-zA-Z 以外的任何单个字符。
但是,你需要一个只匹配 a-zA-Z 的正则表达式:
[a-zA-Z]

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

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

1
我是否正确理解,它只能包含大写字母或小写字母中的一种
new Regex("^([a-z]{1,25}|[A-Z]{1,25})$")

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

顺便说一下,在字符类内部的第一个位置上的插入符号(“^”)表示“非”,因此您的“[^a-z]|[^A-Z]”将意味着“不是任何小写字母,或不是任何大写字母”(忽略a-z并非所有字母)。


1
而且,由于 [^a-z](“除小写ASCII字母外的任何字符”)所描述的集合包括大写字母,而 [^A-Z] 包括小写字母,因此 [^a-z] | [^A-Z] 将匹配任何字符。 - Alan Moore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接