2012-02-10 28 views
0

我们可以使用正则表达式来确定一个字符串是否遵循这些规则?如何创建(C#)正则表达式规则

  • 没有大写字母。
  • 以字母开头。
  • 至少有1位数不是在开始和结束。
  • 最多有8个字母数字
  • 没有任何符号像@#$字符(符号像!@#$%^符号像!@#$%^ & *() - +)。
+10

是的,这可以通过正则表达式来完成。还有其他问题吗?如果你打算要求一个符合上述规则的正则表达式,我想知道你已经尝试了什么以及你卡在哪里。 – Oded 2012-02-10 20:03:11

+0

是字符之间还是个别行之间的值? – circusdei 2012-02-10 20:05:32

+0

我想说这是用于密码验证 – 2012-02-10 20:06:32

回答

2

编辑:我已经更新在代码中的正则表达式有一个看起来工作。

@"^[a-z](?=[[email protected]#\$]*[0-9][[email protected]#\$]*)[[email protected]#\$]{0,6}[[email protected]#\$]$"

编辑:我已经调整了代码。其中一项测试是[email protected],标志着道格拉斯指出它应该成功时会失败。

我已经验证道格拉斯提供的正则表达式的工作原理和短小也一样。


不是这样的答案,但这里有一个快速测试平台。我用@ ShaunWilde的答案使用了正则表达式和测试。

不幸的是,测试不会返回预期的结果: - |。

using System; 
using System.Collections.Generic; 
using System.Text.RegularExpressions; 

namespace StackOverflow.RegularExpressions 
{ 
    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      var validString = 
       new Regex(@"^[a-z][a-z\[email protected]#$%\^&*()\-+]{0,7}$(?<=\d\D+)", 
          RegexOptions.Compiled); 

      var testsAndExpectedResults = new List<Tuple<string, bool>> 
               { 
                new Tuple<string, bool>("[email protected]", true), 
                new Tuple<string, bool>("[email protected]", true), 
                new Tuple<string, bool>("[email protected]", false), 
                new Tuple<string, bool>("[email protected]", false), 
                new Tuple<string, bool>("[email protected]", true), 
                new Tuple<string, bool>("[email protected]", false), 
                new Tuple<string, bool>("[email protected]", true), 
                new Tuple<string, bool>("[email protected]", false), 
                new Tuple<string, bool>("[email protected]", false), 
                new Tuple<string, bool>("[email protected]", false), 
                new Tuple<string, bool>("#[email protected]", false) 
               }; 

      testsAndExpectedResults.ForEach(t => 
              Console.WriteLine("With '{0}' expected {1}, got {2}", t.Item1, t.Item2, 
                   validString.IsMatch(t.Item1)) 
       ); 

      Console.ReadKey(); 
     } 
    } 
} 
+0

用@Douglas的答案尝试了ShaunWilde的测试,这似乎也没有完成任务。 – 2012-02-10 21:14:48

+0

我主张将测试分解出来,如果使得有效字符串发生变化的“策略”会更容易维护。 – 2012-02-10 21:17:15

+0

这是测试是不正确的,不是我的正则表达式。 '“aa1 @ aaaa”'符合问题中提出的所有条件;但是,它被定义为预期在测试中失败。 – Douglas 2012-02-11 17:20:48

2

从内存中;

  • 没有大写"^[^A-Z]*$"
  • 与信"^[A-Za-z].*"
  • 必须在免得1位".*\d+.*"
  • 有多达8个字母数字或@#$字符开始"[[email protected]#\$]{,8}"

现在你应该能够相当简单地将“有这些方式中的任何一种”的“有”子句组合起来,但我不知道它是否可能实际上只有一个正则表达式th在逻辑上是“不是这个,而是其中的一个,这个或这个”。 也许其他海报可以做到这一点!

如果你不确定你的正则表达式,我可以推荐“Expresso”这个非常有用的免费正则表达式探索工具。只需Google就可以了!

+0

您的第二个和第四个正则表达式与第一个正则表达式相矛盾。此外,选举委员会表示,**最多为八个字符,而不是*至少八个。 – 2012-02-10 20:28:37

+2

另外,我们不要为他做他的工作。 – 2012-02-10 20:40:43

+0

最后正则表达式更新 – 2012-02-10 20:47:29

1

先打谷歌为"password validation regular expression"

给我们的

^.*(?=.{10,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$ 

  • 必须至少10个字符
  • 必须至少包含一个一个小写字母,一个大写字母,一个数字和一个特殊字符
  • 有效的特殊字符 - @#$%^ & + =

现在将只需要适应为8个字符(最小),并没有在一开始和数量最终也没有大写的开始信

^.*(?=.{8,})(?=.*\d)(?=.*[a-z])(?=.*[@#$%^&+=])([a-z][^0-9A-Z])[^A-Z]*[^0-9A-Z]$ 

这是在RegExPlanet

1  [email protected]  Yes 
2  [email protected]  Yes 
3  [email protected]   No 
4  [email protected]  No 
5  [email protected]  No 
6  [email protected]  No 
7  [email protected]  No 
8  [email protected]  No 
9  #[email protected]  No 

进行在线测试,我建议你读的第一篇文章,以这是如何构建的(我学到了很多东西)并使用第二个链接(尽管还有许多其他在线regex测试人员)可以使用正则表达式进行播放,而无需一直编译代码。

1
Regex regex = new Regex(@"^[a-z][a-z\[email protected]#$%\^&*()\-+]{0,7}$(?<=\d\D+)"); 
bool isValid = regex.IsMatch(password); 
  • “不是有大写字母。“ - 不匹配A-Z\w您的正则表达式中的任何地方。 “
  • ”以字母开头。“ - 匹配^[a-z]^是字符串开头的锚点。 “
  • ”最多可包含8个字母数字或@#$个字符(符号像!@#$%^ & *() - +)。“ - [a-z\d]{0,7}匹配0-7个字母数字字符。 (这个第一个字母将与前面的[a-z]匹配。)任何其他允许的字符也可以在字符类中指定。需要转义^-
  • “至少有1位数不是在开始和结束。” - 使用否定后视:(?<=\d\D+)\d\D+表示一个数字后跟一个或多个非数字。由于第二种情况,数字在开始时可能不会发生。