【问题标题】:regular expression: The beginning and end of the string with a letter with a specified length正则表达式:字符串的开头和结尾带有指定长度的字母
【发布时间】:2021-03-21 08:21:42
【问题描述】:

我使用这种模式,但我没有得到答案。 Regex reg = new Regex(@"^([A-Za-z][A-Za-z0-9\.]*(?:[A-Za-z])){6,30}@mydomain.com$");

我希望我的字符串以字母开头并以字母结尾,由字母、数字和点组成,只要它的长度在 6 到 30 个字符之间。

例如:a.124b@mydomain.com 或 abc.1e@mydomain.com 和 ...

【问题讨论】:

    标签: c# regex


    【解决方案1】:
        string pattern = @"^[a-z][a-z0-9.]{4,28}[a-z]@mydomain\.com$";
        string input = @"a.124b@mydomain.com";
        RegexOptions options = RegexOptions.IgnoreCase;
        
        foreach (Match m in Regex.Matches(input, pattern, options))
        {
            Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    

    现在解释一下:

    • ^[a-z] 字符串开头,一个字母
    • [a-z0-9.]{4,28} 字母、数字和点字符(在方括号中时不需要转义),重复 4 到 28 次
    • [a-z] 又一封信
    • (6 到 30 个字符的组合)
    • @mydomain\.com$ 其余邮件地址和字符串结尾。

    还要注意RegexOptions.IgnoreCase - 当您知道自己不关心大小写时,它会使字母组更具可读性

    您在正则表达式中犯的错误是为您的 complete 捕获组添加量词 - 意味着整个组重复 6-30 次。

    我还推荐 https://regex101.com/ 满足您所有的正则表达式需求

    【讨论】:

    • 您可以选择在表达式中分别使用 (?i) 和 (?-i) 打开或关闭区分大小写。 @"(?i)^[a-z][a-z0-9.]{4,28}[a-z]@mydomain\.com$"
    【解决方案2】:

    这是一种选择:

    ^(?![0-9.]|.*[0-9.]@)[a-zA-Z0-9.]{6,30}@mydomain\.com$
    

    在线查看demo

    • ^ - 起始线锚点。
    • (?![0-9.]|.*[0-9.]@) - 负预测以防止在“@”之前以点/数字开头或以点/数字结尾。
    • [a-zA-Z0-9.]{6,30} - 类中指定的 6-30 个字符。
    • @mydomain\.com - 字面上匹配“@mydomain.com”。注意点之前的反斜杠使其成为文字(在字符类之外)。
    • $ - 结束线锚。

    我打算提到一个不区分大小写的替代方案,但看起来@FranzGleichmann 让你知道covered =)

    【讨论】:

    • 漂亮的环视,从来没有真正让我的大脑围绕它们。但我让你在性能方面击败了;)
    • 毫无疑问!
    • 我认为您可以通过使用否定字符类来获得更多“性能”,而不是在前瞻^(?![0-9.]|[^\s@]*[0-9.]@) 中匹配@
    猜你喜欢
    • 2013-08-04
    • 2017-09-17
    • 1970-01-01
    • 2021-07-04
    • 2016-12-07
    • 2018-08-14
    相关资源
    最近更新 更多