如何创建(C#)正则表达式规则

时间:2012-02-10 20:01:39

标签: c# regex c#-4.0

我们可以使用正则表达式来查明字符串是否遵循这些规则吗?

  • 没有大写字母。
  • 以信开头。
  • 至少有一个数字不在开头和结尾。
  • 最多8个字母数字
  • 没有任何符号,如@#$字符(符号!@#$%^& *() - +)等符号。

4 个答案:

答案 0 :(得分:2)

从记忆中;

  • 没有大写"^[^A-Z]*$"
  • 以字母"^[A-Za-z].*"
  • 开头
  • 至少有1位".*\d+.*"
  • 最多包含8个字母数字或@#$字符"[A-Za-z0-9@#\$]{,8}"

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

如果您不确定您的正则表达式,我可以推荐“Expresso”一个非常有用的免费正则表达式探索工具。只是谷歌吧!

答案 1 :(得分:2)

编辑:我已经将代码中的正则表达式更新为一个看似有效的表达式。

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

编辑:我已经调整了代码。其中一项测试是aa1@aaaa标记为道格拉斯指出它应该成功时会失败。

我已经证实道格拉斯提供的正则表达式同样适用,而且它也更短。


不是这样的答案,但这是一个快速的试验台。我使用了@ 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\d!@#$%\^&*()\-+]{0,7}$(?<=\d\D+)",
                          RegexOptions.Compiled);

            var testsAndExpectedResults = new List<Tuple<string, bool>>
                                              {
                                                  new Tuple<string, bool>("a1@aaaaa", true),
                                                  new Tuple<string, bool>("a@1aaaaa", true),
                                                  new Tuple<string, bool>("aa@aaaaa", false),
                                                  new Tuple<string, bool>("a1@aaaaaaa", false),
                                                  new Tuple<string, bool>("a1@aaaa", true),
                                                  new Tuple<string, bool>("1a1@aaaa", false),
                                                  new Tuple<string, bool>("aa1@aaaa", true),
                                                  new Tuple<string, bool>("Aa1@aaaa", false),
                                                  new Tuple<string, bool>("Aa1@aaaA", false),
                                                  new Tuple<string, bool>("aA1@aaaA", false),
                                                  new Tuple<string, bool>("#A@a1aaaaa", false)
                                              };

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

            Console.ReadKey();
        }
    }
}

答案 2 :(得分:1)

首先在谷歌搜索"password validation regular expression"

给我们

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

其中

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

现在只需要调整8个字符(最小值)并且在开头和结尾没有数字而没有大写字母并以字母开头

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

RegExPlanet

在线测试
1       a1@aaaaa        Yes 
2       a1@aaaaaaa      Yes
3       a1@aaaa         No
4       1a@aaaaa        No  
5       aa@aaaa1        No  
6       Aa@aa1aa        No  
7       aa@a1aaA        No  
8       aA@a1aaa        No  
9       #A@a1aaaaa      No  

我建议你阅读第一篇文章,了解它是如何构建的(我学到了很多东西)并使用第二个链接(尽管还有许多其他在线正则表达式测试器)来使用正则表达式,而无需一直编译代码

答案 3 :(得分:1)

Regex regex = new Regex(@"^[a-z][a-z\d!@#$%\^&*()\-+]{0,7}$(?<=\d\D+)");
bool isValid = regex.IsMatch(password);
  • “没有大写字母。” - 请勿在正则表达式中的任何位置匹配A-Z\w
  • “以字母开头。” - 匹配^[a-z]^是字符串起始锚。
  • “最多包含8个字母数字或@#$字符(符号!@#$%^&amp; *() - +)。” - [a-z\d]{0,7}匹配0-7个字母数字字符。 (此第一个字母将与前面的[a-z]匹配。)也可以在字符类中指定任何其他允许的字符。 ^-需要转义。
  • “至少有一个数字不在开头和结尾。” - 使用否定的lookbehind:(?<=\d\D+)\d\D+表示由一个或多个非数字跟随的数字。由于第二个条件,开头可能不会出现数字。