【问题标题】:Complicated Regex Validator复杂的正则表达式验证器
【发布时间】:2017-07-11 22:14:16
【问题描述】:

我正在尝试使用正则表达式验证器。诀窍是它可能需要更多的逻辑,但我希望我可以只用正则表达式来完成这个。因此,如果要测试的字符串以@faxmail.com 结尾,那么它也必须以“1”开头。否则,基本上任何不以@faxmail.com 结尾的东西都是匹配的。所以如果我只用 C# 做这个,它可能看起来像

if(someString.EndsWith("@faxmail.com"))
{
    if(!someString.StartsWith("1,")) return false;
} else {
    return true;
}

我尝试过类似(?(?=^(\w+)@faxmail.com$)(^1))) 的方法,它部分有效。最后我需要这样的东西:

1,test@faxmail.com (passes)
fail@faxmail.com (fails)
test@testmail.com (passes)

我想要通过正则表达式实现的目标是可行的,还是只需要使用 C# 逻辑?

【问题讨论】:

    标签: c# regex validation regex-lookarounds


    【解决方案1】:

    你可以试试这个正则表达式:

        Regex regex = new Regex(@"^1.*(@faxmail.com)$|.*(?<!@faxmail.com)$");
    

    这里有两个正则匹配:

    1. 以 1 开头,后跟任意字符,以“@faxmail.com”结尾,或
    2. 任何不以“@faxmail.com”结尾的字符串

    您可以使用以下测试用例进行验证:

    Regex regex = new Regex(@"^1.*(@faxmail.com)$|.*(?<!@faxmail.com)$");
    Console.WriteLine(regex.IsMatch("1,test@faxmail.com")); //True
    Console.WriteLine(regex.IsMatch("fail@faxmail.com")); //False
    Console.WriteLine(regex.IsMatch("test@testmail.com")); //True
    Console.WriteLine(regex.IsMatch("faxmail@faxmail.com@testmail.com")); //True
    Console.WriteLine(regex.IsMatch("2,test@faxmail.com")); //False
    

    【讨论】:

    • 哇,这太棒了!谢谢。唯一的问题是倒数第二个测试用例 (faxmail@faxmai.com@testmail.com) 实际上不应该通过,因为我们的传真服务器可能会阻塞。所以我可能不得不做一些调整并继续测试。但这将使我朝着正确的方向前进。再次感谢!
    • 是的,您可能想要实现一个标准的电子邮件正则表达式来在此之前捕获那种电子邮件输入。
    • 是的。这实际上是我使用 EmailAddressAttribute 以及派生的 RegexAttribute 计划的一部分。
    • 唯一的缺点是 Javascript 显然不支持向后看,所以这似乎不适用于客户端验证。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 2011-08-08
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多