全球否定并使案例不敏感

时间:2015-06-15 17:51:18

标签: c# regex asp.net-mvc case-sensitive

有更好的方法吗?我无法弄清楚如何添加(?i)所以我可以使模式全局不区分大小写,同时仍然将语句保持为否定。

[Required(ErrorMessage = "Address")]
[RegularExpression("^(?!.*(p|P)\\.?(o|O)\\.?\\s+?(box|Box|BOX)).*$", ErrorMessage = "We cannot ship to PO boxes")]
public string CustomerAddress1 { get; set; }

2 个答案:

答案 0 :(得分:3)

我测试了这一点,只是将(?i)添加到开头(正如@sln所说)对我来说很好。

这是我的测试代码,在控制台应用中:

static void Main(string[] args)
{
    TestForPoBox("PO BOX 111");
    TestForPoBox("P.O. Box 222");
    TestForPoBox("p.O. boX 333");
    TestForPoBox("444 Main Street");

    Console.ReadKey();
}

static void TestForPoBox(string streetAddress)
{            
    const string pattern = "(?i)^(?!.*p\\.?o\\.?\\s+?box).*$";
    Match match = Regex.Match(streetAddress, pattern);

    //Write out the matches
    if (match.Length > 0)
        Console.WriteLine("OK. Address is not a P.O. Box: " + streetAddress);
    else
        Console.WriteLine("INVALID. Address contains a P.O. Box: " + streetAddress);
}

这是输出:

INVALID. Address contains a P.O. Box: PO BOX 111
INVALID. Address contains a P.O. Box: P.O. Box 222
INVALID. Address contains a P.O. Box: p.O. boX 333
OK. Address is not a P.O. Box: 444 Main Street

<小时/> 编辑:我道歉;我只是在纯粹的C#端试了这个。有了你正在做的MVC模型验证,你需要一个适用于C#和JavaScript的Regex表达式。从本质上讲,C#支持(?i)...表示不区分大小写,而JavaScript支持/.../i。但两种符号都不适用于另一种。你可能做的最好的是你已经拥有的东西(拼写出p|Po|O等),或者像杰里米库克那样的自定义RegularExpressionWithOptions属性{{3 }}。

答案 1 :(得分:-1)

您可以在比较期间对字符串使用.tolower()方法。