我是正则表达式的初学者,所以我坚持一些可能相当简单的事情 - 或许它不是,我只是不知道。同时道歉的是,我将逐步介绍我的思考过程,不确定它是否真的有用。
无论如何,我想验证用户输入的值是否符合我列出的某些标准。这些是:
最大长度为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个数字的子句?
答案 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
等