[英]How can I get a regex to check that a string only contains alpha characters [a-z] or [A-Z]?
我正在尝试创建一个正则表达式来验证给定的字符串只有字母az或AZ。 该字符串最长可达25个字母。 (我不确定正则表达式是否可以检查字符串的长度)
例子:
1. "abcdef" = true;
2. "a2bdef" = false
;
3. "333" = false;
4. "j" = true;
5. "aaaaaaaaaaaaaaaaaaaaaaaaaa" = false;
// 26封信
以下是我到目前为止的情况......虽然无法弄清楚它有什么问题
Regex alphaPattern = new Regex("[^az]|[^AZ]");
我认为这意味着字符串只能包含来自az的大写或小写字母,但是当我将它与所有字母的字符串匹配时,它返回false ...
此外,任何有关使用正则表达式与其他验证方法的效率的建议将非常感激。
Regex lettersOnly = new Regex("^[a-zA-Z]{1,25}$");
^
表示“在字符串开头处开始匹配” [a-zA-Z]
表示“匹配小写字母和大写字母az” {1,25}
表示“匹配前一项(字符类,见上文)1至25次” $
表示“仅匹配光标位于字符串末尾” 我正在尝试创建一个正则表达式来验证给定的字符串只有字母az或AZ。
很容易完成,因为许多其他人已经指出使用所谓的“字符类”。 从本质上讲,这些允许我们指定一系列值来用于匹配:(注意:为了简化,我假设隐含^和$ anchors,这将在本文后面解释)
[az]匹配任何单个小写字母。
例如:匹配,8不匹配
[AZ]匹配任何单个大写字母。
例如:匹配,a不匹配
[0-9]匹配任何单个数字零到九
例如:8场比赛,a不匹配
[aeiou]仅在a或e或i或o或u上匹配。 例如:匹配,z不匹配
[a-zA-Z]匹配任何单个小写或大写字母。 例如:匹配,匹配,3不匹配
当然,这些也可以被否定: [^ az]匹配任何不是小写字母ex的东西:5个匹配,A个匹配,a匹配不匹配
[^ AZ]匹配任何不是大写字母ex:5匹配,A不匹配,匹配
[^ 0-9]匹配任何不是数字的东西:5不匹配,A匹配,匹配
[^ Aa69]匹配任何东西,只要它不是A或a或6或9 ex: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。 ex:a不匹配,aa匹配,aaa匹配,aba不匹配,aaaaaaaaa匹配
{2,5}匹配两到五个a。 ex:a不匹配,aa匹配,aaa匹配,aba不匹配,aaaaaaaaa不匹配
重复扩展到字符类,因此: [az] {5}将任意五个小写字符匹配在一起。 ex:bubba匹配,Bubba不匹配,BUBBA不匹配,asdjo匹配
[AZ] {2,5}将两到五个大写字符匹配在一起。 ex:bubba不匹配,Bubba不匹配,BUBBA比赛,BUBBETTE不匹配
[0-9] {4,8}将四到八个数字匹配在一起。 例如:bubba不匹配,15835匹配,44不匹配,3456876353456不匹配
[a3g] {2}如果它们一起出现两次,则匹配一个OR 3 OR g。 例如:aa匹配,ba不匹配,33匹配,38不匹配,a3不匹配
现在让我们来看看你的正则表达式: [^ az] | [^ AZ]翻译:匹配任何东西,只要它不是小写字母或大写字母。
要修复它以满足您的需求,我们会像这样重写它:第1步:删除否定[az] | [AZ]翻译:找到任何小写字母或大写字母。
第2步:虽然不是非常需要,但是让我们稍微清理OR逻辑[a-zA-Z]翻译:找到任何小写字母或大写字母。 与上面相同,但现在只使用一组[]。
第3步:现在让我们指出“长度” [a-zA-Z] {1,25}翻译:找到任何小写字母或大写字母重复一到二十五次。
这是事情变得时髦的地方。 你可能认为你在这里完成了,你很可能依赖于你正在使用的技术。
严格地说正则表达式[A-ZA-Z] {1,25}将ANYWHERE匹配线之一25上或小写字母:
[a-zA-Z] {1,25} a匹配,aZgD匹配,BUBBA匹配,243242hello242552 MATCHES
事实上,到目前为止我给出的每个例子都会做同样的事情。 如果这就是你想要的,那么你的状态很好,但根据你的问题,我猜你只需要整行上一到二十五个大写或小写字母。 为此我们转向锚点。 锚点允许我们指定那些讨厌的细节:
^行的开头
(我知道,我们刚才用这个来否定,不要让我开始)
$ end of a line
我们可以像这样使用它们:
^ a {3}从一行开始匹配三次ex:aaa匹配,123aaa不匹配,aaa123匹配
a {3} $在一行结束时匹配三次:aaa匹配,123aaa匹配,aaa123不匹配
^ A {3} $ 整条生产线的前三次的搭配在一起:AAA比赛,123aaa不匹配,AAA123不匹配
请注意,aaa在所有情况下都匹配,因为从技术上讲,它在行的开头和结尾有三个a。
因此,最终的,技术上正确的解决方案是,在一条线上找到“最多五个字符长”的“单词”将是:
^ [A-ZA-Z] {1,25} $
时髦的部分是,有些技术隐含地为你设置了正则表达式,有些技术没有。 您只需要测试正则表达式或阅读文档以查看是否有隐式锚点。
/// <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);
}
该字符串最长可达25个字母。 (我不确定正则表达式是否可以检查字符串的长度)
正则表达式可以检查字符串的长度 - 从其他人发布的答案中可以看出。
但是,当您验证用户输入(例如,用户名)时,我会建议单独执行该检查。
问题是,正则表达式只能告诉你字符串是否与之匹配。 它不会告诉它为什么不匹配。 文本太长还是包含不允许的字符 - 你无法分辨。 当一个程序说:“提供的用户名包含无效字符或太长”时,它远非友好。 相反,您应该为不同的情况提供单独的错误消息。
您正在使用的正则表达式是[^az]
和[^AZ]
的交替。 表达式[^…]
意味着匹配除字符集中描述的字符之外的任何字符。
总的来说,表达式意味着匹配除az
之外的任何单个字符或AZ
之外的任何单个字符。
但您需要一个仅与a-zA-Z
匹配的正则表达式:
[a-zA-Z]
并指定其长度,使用字符串的开始( ^
)和结束( $
)锚定表达式,并使用{
n
,
m
}
量词描述长度,表示至少n
但不超过m
次重复:
^[a-zA-Z]{0,25}$
难道我理解正确的话,它只能包含大写 或小写字母?
new Regex("^([a-z]{1,25}|[A-Z]{1,25})$")
对于这种情况,正则表达式似乎是正确的用法。
顺便说一下,字符类中第一个位置的插入符号(“^”)表示“不”,所以你的“ [^az]|[^AZ]
”意思是“不是任何小写字母,或者不是任何大写字母“(不管az不是所有字母)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.