Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/45.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# RegEx检查验证字符串是否有0个或多个数值&;其他项目_C#_Regex - Fatal编程技术网

C# RegEx检查验证字符串是否有0个或多个数值&;其他项目

C# RegEx检查验证字符串是否有0个或多个数值&;其他项目,c#,regex,C#,Regex,我是正则表达式的初学者,所以我一直在研究一些应该相当简单的东西——或者可能不是,我只是不知道。我也为我将一步一步地讲述我的思考过程而道歉,我不确定它是否真的有用 无论如何,我想验证用户输入的值是否符合我制定的某些标准。这些是: 最大长度为10 最小长度为4 至少4个字母 可变最小数(当前为0) 所以理论上aa1aa2的值会通过 最初我从以下内容开始,它验证了4个小写或4个大写 [a-z]{4}|[A-Z]{4}$ 但这不允许使用或,这导致我更新了它 ([a-z]|[A-Z]){4}$ 为了验

我是正则表达式的初学者,所以我一直在研究一些应该相当简单的东西——或者可能不是,我只是不知道。我也为我将一步一步地讲述我的思考过程而道歉,我不确定它是否真的有用

无论如何,我想验证用户输入的值是否符合我制定的某些标准。这些是:
最大长度为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个数字的情况下设置子句

在C#regex引擎中(如在PCRE中),可以使用
\p{L}
匹配任何小写/大写Unicode字母。在look aheads的帮助下设置限制。锚(
^
$
)用于检查整个字符串/行

这里有一个正则表达式可以检查您的条件。现在,只需输入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次
  • $
    -字符串/行结束

请参见。

正如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;
 }
static void Main(字符串[]args)
{
var input=“testtest”;
var numDigits=2;
bool valid=input.Length>3
&&输入。长度<11
&&input.Where(char.isleter).Count()>3
&&input.Where(char.IsDigit).Count()>numDigits;
}

使用这种方法,您可以对验证进行分段,并向用户提供更有用的响应:
输入必须至少是4个字母

不是答案,而是建议:即使您创建了一个可以验证这四个条件的正则表达式,但我不确定您是否可以,任何阅读你的代码的人都不可能理解它的意图。我建议将验证分为几个步骤,并使用单独的、更简单的表达式来验证每个步骤。是一个学习正则表达式并测试它的非常酷的网站