我正在尝试创建一个正则表达式来验证给定的字符串是否只有 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}$
有趣的是,有些技术隐含地为您在正则表达式中放置了锚点,而有些则没有。您只需测试您的正则表达式或阅读文档以查看您是否有隐式锚点。