【问题标题】:How to create (C#) Regular Expression Rules如何创建 (C#) 正则表达式规则
【发布时间】:2012-02-10 20:01:38
【问题描述】:

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

  • 没有大写字母。
  • 以字母开头。
  • 至少有 1 个数字不在开头和结尾。
  • 最多有 8 个字母数字
  • 没有像@#$ 字符这样的符号(像!@#$%^&*()-+ 这样的符号)。

【问题讨论】:

  • 是的,这可以通过正则表达式来完成。还有其他问题吗?如果您想要求一个符合上述规则的正则表达式,我想知道您尝试了什么以及卡在哪里。
  • 值是在字符之间还是在单独的行上?
  • 我要说这是为了密码验证
  • 在我看来,使用纯字符串方法(包含、StartsWith 等)要容易得多

标签: c# regex c#-4.0


【解决方案1】:

编辑:我已将代码中的正则表达式更新为看起来可以工作的正则表达式。

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

编辑:我已经调整了代码。其中一项测试是 aa1@aaaa 标记为预期会失败,正如 Douglas 所指出的那样应该成功。

我已经验证了 Douglas 提供的正则表达式同样有效,而且它也更短。


不是这样的答案,但这里有一个快速测试装置。我使用了@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();
        }
    }
}

【讨论】:

  • 用@Douglas 的回答尝试了 ShaunWilde 的测试,但这似乎也不能很好地完成这项工作。
  • 我主张将测试分开,如果使有效字符串发生变化的“策略”会更容易维护。
  • 这是不正确的测试,而不是我的正则表达式。 "aa1@aaaa" 满足问题中列出的所有条件;然而,它被定义为在测试中失败。
  • @Douglas 我已经相应地调整了测试并更新了我的答案并支持你的答案。
【解决方案2】:

凭记忆;

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

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

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

【讨论】:

  • 您的第二个和第四个正则表达式与第一个正则表达式相矛盾。此外,OP 说最多八个字符,而不是至少八个。
  • 还有,我们不要替他做他的工作。
  • 根据我的帖子,我怀疑我的第一个“非”类型匹配与所有其他三个相矛盾!正如我所说,我不知道如何(或即使)您可以将所有要求组合到一个正则表达式中。也就是说,我认为一些答案会帮助 OP!
【解决方案3】:

"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       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  

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

【讨论】:

    【解决方案4】:
    Regex regex = new Regex(@"^[a-z][a-z\d!@#$%\^&*()\-+]{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 个数字不在开头和结尾。” – 使用否定的lookbehind:(?&lt;=\d\D+)\d\D+ 表示一个数字后跟一个或多个非数字。由于第二个条件,数字可能不会出现在开头。

    【讨论】:

      猜你喜欢
      • 2023-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      • 2015-12-05
      • 2016-02-10
      • 1970-01-01
      相关资源
      最近更新 更多