10

我有一个正则表达式,我试图找出我正在使用的 .NET 数据注释验证模型。目前它看起来像这样

[RegularExpression("^((?!City)[a-zA-Z '])+$", ErrorMessage = "City is required and must be properly formatted.")]

这个正则表达式的前半部分是为了说明城市,后半部分是为了确保它只有字母和空格。

输入文本框的默认值为City,所以只是“City”不能通过验证。我似乎无法让该正则表达式的第一部分让这些案例通过。

Cityville  
City City
Jersey City
Arizona City

但这种情况没有通过:

City

任何帮助将不胜感激。

*编辑* 这个成功了:

^((?!^City$)[a-zA-Z '])+$

我更新了所有验证以包含此内容。以防万一你想看看我在做什么。如果我正在使用的整个验证数据模型的代码在这里。(使用正确的正则表达式更新)

public class FormModel {
    [Required(ErrorMessage = "First Name is a Required field.")]
    [DataType(DataType.Text)]
    [Display(Order = 1, Name = "FirstName")]
    [RegularExpression("^((?!^First Name$)[a-zA-Z '])+$", ErrorMessage = "First name is required and must be properly formatted.")]
    public string FirstName { get; set; }

    [Required(ErrorMessage = "Last Name is a Required field.")]
    [DataType(DataType.Text)]
    [Display(Order = 2, Name = "LastName")]
    [RegularExpression("^((?!^Last Name$)[a-zA-Z '])+$", ErrorMessage = "Last name is required and must be properly formatted.")]
    public string LastName { get; set; }

    [Required(ErrorMessage = "Address is a Required field.")]
    [DataType(DataType.Text)]
    [Display(Order = 3, Name = "Address")]
    [RegularExpression("^((?!^Address$)[0-9A-Za-z #.,])+$", ErrorMessage = "Address is required and must be properly formatted.")]
    public string Address { get; set; }

    [DataType(DataType.Text)]
    [Display(Order = 4, Name = "Address2")]
    public string Address2 { get; set; }

    [Required(ErrorMessage = "City is a Required field.")]
    [DataType(DataType.Text)]
    [RegularExpression("^((?!^City$)[a-zA-Z '])+$", ErrorMessage = "City is required and must be properly formatted.")]
    [Display(Order = 6, Name = "City")]
    public string City { get; set; }

    [Required( ErrorMessage = "State is a Required field." )]
[DataType( DataType.Text )]
[Display( Order = 7, Name = "State" )]
public IEnumerable<String> State { get; set; }

[Required( ErrorMessage = "Zip is a Required field." )]
[DataType( DataType.Text )]
[RegularExpression( "\\d{5}",
        ErrorMessage = "Zip Code is required and must be properly formatted.")]
[Display( Order = 8, Name = "Zip" )]
public String Zip { get; set; }

[Required( ErrorMessage = "Phone is a Required field." )]
[DataType( DataType.PhoneNumber )]
[RegularExpression( "^[01]?[- .]?\\(?[2-9]\\d{2}\\)?[- .]?\\d{3}[- .]?\\d{4}$",
        ErrorMessage = "Phone is required and must be properly formatted.")]
[Display( Order = 9, Name = "Phone" )]
public string Phone { get; set; }

[Required( ErrorMessage = "Email is a Required field." )]
[DataType( DataType.EmailAddress )]

[RegularExpression( "^[A-Za-z0-9._%+-]*@[A-Za-z0-9.-]*\\.[A-Za-z0-9-]{2,}$",
        ErrorMessage = "Email is required and must be properly formatted.")]
[Display( Order = 10, Name = "Email" )]
public string Email { get; set; }
4

5 回答 5

4

试试这个正则表达式 - ^((?!^City$)[a-zA-Z '])+$
为了对“City”进行否定检查,我在 City 添加了一个开始 (^) 和结束 ($) 字符。我已经在http://regex101.com/r/bF4bZ3对其进行了测试,如果我正确理解了要求,它似乎可以工作。

于 2013-05-28T16:09:54.287 回答
2

其他答案为您提供了您请求的正则表达式的帮助。我将评论一个稍微不同的方面——默认值应该是有意义的,或者根本没有(“城市”是一个糟糕的默认值)。

您可能想要做的是放置占位符文本,一旦您进入文本框就会消失。如果您使用的是 NET 4.5,则可以使用Display属性的Prompt属性执行此操作 - 有关详细信息,请参阅此答案

不使用假默认值意味着您可以使用[Required]并且用户将需要输入一些内容,并且不再需要跟踪您的假默认值是什么。

顺便说一句,“城市”是一个有效的地名——威尔士有两个村庄叫城市,苏黎世有一个地区!

于 2013-05-28T17:32:05.070 回答
1

(?!City)表示City零宽度负前瞻,因此,^((?!City)[a-zA-Z '])+$表示:

  • 仅包含字母空格和 '
  • 不含City

以下是如何禁止City

//Regular Expression    
//^(?!^\s*City\s*$)[a-zA-Z ']+$
//as a .Net string  
string str = "^(?!^\\s*City\\s*$)[a-zA-Z ']+$"

演示

于 2013-05-28T16:06:51.883 回答
1

正则表达式中的负匹配通常是一个坏主意,只是不是这样设计的。最好的方法是检查:

"^City$"

并否定测试。在这种情况下,你真的没有选择这样做。

你真的很接近,你只需要将你的锚移动到负前瞻中,并给字符串一个最小长度。

(?!^City$)[-a-zA-Z ]{4,}

这将匹配 4 个或更多字符且不是“City”的任何内容。

如果没有最小长度,“City”中的“ity”将是对您没有帮助的匹配项。

如果您愿意,可以通过在后面添加一个外观来将最小长度减少到 3。

(?!^City$)[-a-zA-Z ]{3,}(?<!^City$)
于 2013-05-28T17:23:14.473 回答
0

这实际上是您的一个非常小的错误。将您的正则表达式更改为:

^(?!^City$)[a-zA-Z ']+$

你会得到想要的效果。基本上 + 表示一次或多次,并且由于您将整个表达式括在括号中,这些表达式将出现一次或多次,它会在字符串中的任何点找到“City”匹配......这反而说,在英文:不是“City”,字母和空格或单引号出现一次或多次。

测试 Regex 的一个好工具是 Regex Hero:http ://regexhero.net/tester

于 2013-05-28T16:02:18.187 回答