C# 写这个正则表达式的更好方法?

C# 写这个正则表达式的更好方法?,c#,.net,regex,passwords,C#,.net,Regex,Passwords,我有一个用于正在构建的应用程序的密码regex,其目的是: 确保用户使用6-12个字符 确保用户使用一个特殊字符或一个数字 而且它不区分大小写 应用程序位于.net中,我有以下正则表达式: I have the following regex for the password checker, bit lengthy but for your viewing if you feel any of this is wrong please let me know. ^(?=.*\d)(?=.*[

我有一个用于正在构建的应用程序的密码regex,其目的是:

确保用户使用6-12个字符

确保用户使用一个特殊字符或一个数字

而且它不区分大小写

应用程序位于.net中,我有以下正则表达式:

I have the following regex for the password checker, bit lengthy but for your viewing if you feel any of this is wrong please let me know.

^(?=.*\d)(?=.*[A-Za-z]).{6-12}$|^(?=.*[A-Za-z])(?=.*[!#$%&'\(\)\*\+-\.:;<=>\?@\[\\\]\^_`\{\|\}~0x0022]|.*\s).{6,12}$
只是对正则表达式进行分解,以确保您的所有人都满意它是正确的

^ = start of string ”^” 

(?=.*\d) = must contain “?=” any set of characters “.*” but must include a digit “\d”.

(?=.*[A-Za-z]) = must contain “?=” any set of characters “.*” but must include an insensitive case letter.

.{6-12}$ = must contain any set of characters “.” but must have between 6-12 characters and end of string “$”.

|^ = or “|” start of string “^”

(?=.*[A-Za-z]) = must contain “?=” any set of characters “.*” but must include an insensitive case letter.

(?=.*[!#$%&'\(\)\*\+-\.:;<=>\?@\[\\\]\^_`\{\|\}~0x0022]|.*\s)  = must contain “?=” any set of characters “.*” but must include at least special character we have defined or a space ”|.*\s)”. “0x0022” is Unicode for single quote “ character. 

.{6,12}$ = set of characters “.” must be between 6 – 12 and this is the end of the string “$”
这是相当冗长的,似乎正在做的工作,但我想知道是否有更简单的方法来编写这种正则表达式,我想知道如何缩短它,如果可能的话


感谢高级版。

我不确定您所做的是否合理,但要实现这一点,您的正则表达式可以更简单

^(?=.*[A-Za-z])(?=.*[\d\s!#$%&'\(\)\*\+-\.:;<=>\?@\[\\\]\^_`\{\|\}~0x0022]).{6,12}$

为什么要使用替代品?只需将\d和\s添加到字符类。

它必须是正则表达式吗?查看需求,您只需要String.Length和String.IndexOfAny。

首先,为您的正则表达式提供注释是一件好事。然而,有一个更好的方法。只需在自由间隔模式下编写带有大量注释的正则表达式。通过这种方式,您可以在源代码中记录您的正则表达式,并提供缩进,以在有大量括号时提高可读性。下面是我如何用C代码编写原始正则表达式:

如果Regex.IsMatchusernameString, @验证具有数字和/或特殊字符的用户名。 ^要么。。。锚定到字符串的开头。 ?=.*\d断言有一个数字和 ?=.*[A-Za-z]断言存在一个alpha。 .{6-12}匹配长度为6到12的任何名称。 $Anchor到字符串的末尾。 |^或。。。锚定到管柱的起点 ?=.*[A-Za-z]断言存在一个alpha和 ?=.*断言存在一个特殊字符 [!$%&'\\*\+-\.:;\?@\[\\]\^\\\\\{\\\\\\}~\x22] |.*\s或空格字符。 结束特殊字符或空间断言。 .{6-12}匹配长度为6到12的任何名称。 $Anchor到字符串的末尾。 ,RegexOptions.IgnorePatternWhitespace{ //有效用户名。 }否则{ //无效的用户名。 } 上面的代码段使用了更好的@。。。简化元字符转义的字符串语法。这个原始正则表达式使用破折号错误地分隔了花括号量词的两个数字,即{6-12}。正确的语法是用逗号分隔这些数字,即..*{6,12}。也许.NET允许使用{6-12}语法?我还将0x0022双引号字符更改为\x22

也就是说,是的,原始正则表达式可以稍加改进:

如果Regex.IsMatchusernameString, @验证具有数字和/或特殊字符的用户名。 ^锚定到字符串的开头。 ?=.*?[A-Za-z]断言存在阿尔法。 ?:用于断言备选方案的组。 ?=.*?\d是否断言有一个数字 |或者断言有一个特殊的字符 ?=.*?[!$%&'*+-.:;?@[\\]^{124}~\ x22\s]或空格。 断言备选方案的结束组。 .{6,12}匹配长度为6到12的任何名称。 $Anchor到字符串的末尾。 ,RegexOptions.IgnorePatternWhitespace{ //有效用户名。 }否则{ //无效的用户名。 } 这个正则表达式消除了全局替换,而是使用非捕获组作为digit或specialchar断言替换。此外,只需将\s添加到特殊字符列表中,就可以消除特殊字符或空白替代项的非捕获组。我还为断言中的点星添加了一个惰性修饰符,即…*?-这可能会使正则表达式匹配更快一些。从specialchar角色类中删除了大量不必要的转义

但正如Stema聪明地指出的,您可以将数字和特殊字符组合起来,以进一步简化:

如果Regex.IsMatchusernameString, @验证具有数字和/或特殊字符的用户名。 ^锚定到管柱的起点 ?=.*?[A-Za-z]断言存在阿尔法。 断言有一个特殊的字符,空格 ?=.*?[!$%&'*+-.:;?@[\\]^{124}~\ x22\s\d]或数字。 .{6,12}匹配长度为6到12的任何名称。 $Anchor到字符串的末尾。 ,RegexOptions.IgnorePatternWhitespace{ //有效用户名。 }否则{ //无效的用户名。 }
除此之外,你的原始正则表达式在准确性方面没有什么问题。然而,从逻辑上讲,这个公式允许用户名以空格结尾,这可能不是一个好主意。我还将在名称中明确指定允许的字符的白名单,而不是使用过度允许的字符。点。

Uhh。。。我只是觉得有必要把这个链接贴到一个相关的XKCD漫画上::-没有回答这个问题,但是我想把密码长度限制在12个字符以内
这是个坏主意,你有问题。简单,使用正则表达式!隐马尔可夫模型。。现在你有两个问题。你的权利是坏的,但密码存储为哈希的。。。我知道的最大长度没有任何意义…聪明的移动,哈哈用4个字符简化了它并删除了加载,谢谢伙计…是的,你的权利,我可以使用String.IndexOfAny,应用程序的遗留部分为我完成了regex的所有工作,我只需将regex字符串更改为我想要的。gob-smacked regex guru 1感谢您的支持ridgerunner..net到目前为止还没有对6,12造成任何问题。似乎正在接受并执行它。将在测试后确认。+1用于详细解释的答案和注释的正则表达式。