RegEx检查验证字符串是否具有0或更多数值&其他项目

时间:2015-04-20 15:47:01

标签: c# regex

我是正则表达式的初学者,所以我坚持一些可能相当简单的事情 - 或许它不是,我只是不知道。同时道歉的是,我将逐步介绍我的思考过程,不确定它是否真的有用。

无论如何,我想验证用户输入的值是否符合我列出的某些标准。这些是:
最大长度为10
最小长度为4
至少4个字母
可变的最小数字(目前为0)

理论上,aa1aa2的价值会超过。

最初我开始使用以下内容,它验证了4个小写或4个大写。

[a-z]{4}|[A-Z]{4}$

但是这并没有允许/或者导致我更新它

([a-z]|[A-Z]){4}$

要验证它是否包含必要的最小数字,我将其更改为:

(([a-z]|[A-Z]){4})([0-9]{0})$

我可以通过在某些情况下进行不同尝试工作/失败来鼓励人们,但基本上我开始注意到它只验证了有4个字母和数字的实例,我最终(在同事的帮助下)来了这个:

^(?!^[0-9]*$)(?!^[a-zA-Z]{4}$)^([a-zA-Z0-9]{4,10}$)

这几乎可以解决,因为我想要它。它将验证字符串的长度,以及是否存在大写/小写,但仅在我包含数字时才有效。我在下半场({4,10}之前)和{0}之前取消0-0所做的任何尝试都没有成功。基本上没有数字它不会工作!

如何修改最终片段以便我可以设置一个可能有0个数字的子句?

2 个答案:

答案 0 :(得分:3)

在C#正则表达式引擎中(如在PCRE中),您可以使用\p{L}来匹配任何大写/小写的Unicode字母。限制是在前瞻的帮助下设定的。锚点(^$)用于检查整个字符串/行。

这是一个正在检查您的条件的正则表达式。现在,它只需输入1位数字:

^(?=.*\p{L}.*\p{L}.*\p{L}.*\p{L}.*$)(?=.*\d.*$).{4,10}$

说明:

  • ^ - 字符串/行开始
  • (?=.*\p{L}.*\p{L}.*\p{L}.*\p{L}.*$) - 要求至少4个可能不连续的Unicode字母的正面预测。
  • (?=.*\d.*$) - 要求至少1位数的正面预测
  • .{4,10} - 任意字符,4到10次出现
  • $ - 字符串/行结束

请参阅demo上的regexstorm.net

答案 1 :(得分:0)

正如Dan所说,我也非常喜欢更具可读性的方法:

 static void Main(string[] args)
 {
     var input = "testtest";
     var numDigits = 2;

     bool valid = input.Length > 3
                  && input.Length < 11
                  && input.Where(char.IsLetter).Count() > 3
                  && input.Where(char.IsDigit).Count() > numDigits;
 }

使用此方法,您可以对验证进行细分,并为用户提供更有用的响应:input must be at least 4 letters