如何获取正则表达式来检查字符串是否只包含字母字符[az]或[AZ]?

17 c# regex asp.net verification

我正在尝试创建一个正则表达式来验证给定的字符串只有字母az或AZ.该字符串最长可达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]");

我认为这意味着字符串只能包含来自az的大写或小写字母,但是当我将它与所有字母的字符串匹配时,它返回false ...

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

Bli*_*ixt 37

Regex lettersOnly = new Regex("^[a-zA-Z]{1,25}$");
Run Code Online (Sandbox Code Playgroud)
  • ^ 表示"在字符串开头处开始匹配"
  • [a-zA-Z] 表示"匹配小写字母和大写字母az"
  • {1,25} 表示"匹配前一项(字符类,见上文)1至25次"
  • $ 表示"只有当光标位于字符串的末尾时才匹配"

  • 你不想在这里使用Multiline选项; 没有它,^和$意味着整个字符串*的开始和结束(分别),这正是所需要的.(*除了$也在字符串末尾的换行符之前匹配,yadda yadda ...通过Grabthar,我希望我们可以在那个上做一次!) (3认同)
  • 您还需要设置`RegexOptions.MultiLine`以阐明^和$字符的含义.否则,提供的表达式看起来很完美.+1 (2认同)

zai*_*nab 18

我正在尝试创建一个正则表达式来验证给定的字符串只有字母az或AZ.

很容易完成,因为许多其他人已经指出使用所谓的"字符类".从本质上讲,这些允许我们指定用于匹配的一系列值:(注意:为了简化,我假设隐含^和$ anchors,这将在本文后面解释)

[az] 匹配任何单个小写字母.
例如:匹配,8不匹配

[AZ] 匹配任何单个大写字母.
例如:匹配,a不匹配

[0-9] 匹配任何单个数字零到九个
ex: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}将匹配一个到25上或小写字母ANYWHERE上一行:

[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} $

时髦的部分是,有些技术隐含地为你设置了正则表达式,有些技术没有.您只需要测试正则表达式或阅读文档以查看是否有隐式锚点.


Ras*_*dit 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);
}
Run Code Online (Sandbox Code Playgroud)


Ren*_*soo 6

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

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

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

问题是,正则表达式只能告诉你字符串是否与之匹配.它不会告诉它为什么不匹配.文本太长还是包含不允许的字符 - 你无法分辨.当一个程序说:"提供的用户名包含无效字符或太长"时,它远非友好.相反,您应该为不同的情况提供单独的错误消息.

  • 同意.因此,对我来说,不会产生2个,但有3个可能的消息:"提供的用户名包含无效字符(仅允许..)","提供的用户名太长(允许的最大数量为)",或"提供的用户名包含无效字符(仅允许..)且太长(允许最多...)".我非常不喜欢输入验证,它没有提供可接受输入的线索,只是让你从一个错误运行到另一个错误...... (3认同)