【问题标题】:@Pattern validation on a blank field@Pattern 验证空白字段
【发布时间】:2016-06-14 12:29:37
【问题描述】:

我正在使用验证注释来验证电子邮件字段,这里电子邮件字段不是强制性的,当我点击提交时,它正在验证并在字段为空时抛出错误消息,

以下是注释:

@Pattern(regexp = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$", 
            message = "registration.label.useremailformat.invalidformat")
@Size(min = 6, max = 20, message = "registration.label.useremail.length")
@SafeHtml
private String userEmailId;

如何在电子邮件字段为空时跳过@Pattern 验证并仅在给定值时验证?任何帮助将不胜感激。

【问题讨论】:

  • - 在字符类中的位置错误
  • 该模式需要一些文本。试试regexp = "^(?:[_A-Za-z0-9-+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,}))?$"。另外,检查min 参数。
  • @Wiktor Stribiżew - 未显示任何错误消息,但未提交表单
  • 是的,可能是因为 @Size 限制。如果您删除大小检查并仅使用regexp = "^(?:(?=.{6,20}$)[_A-Za-z0-9-+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z‌​]{2,}))?$" 会怎样?见this demo
  • 我也删除了@Size,仍然无法正常工作

标签: java regex bean-validation


【解决方案1】:

修改你的正则表达式以允许空字符串删除@Size:

@Pattern("^$|(<<old regexp>>)")
@SafeHtml
private String userEmailId;

...其中&lt;&lt;old regex&gt;&gt; 是您当前冗长的正则表达式的占位符。

【讨论】:

    【解决方案2】:

    似乎问题在于@Size 限制即使在将整个正则表达式模式设为可选之后也不允许提交表单。

    我建议的解决方法是将大小限制移动到正则表达式模式中:

    regexp = "^(?:(?=.{6,20}$)[_A-Za-z0-9-+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+‌​‌​)*(\\.[A-Za-z‌​]{2,}))?$"
    

    外部(?:...)? 包含您的模式,从而可以匹配一个空字符串,而(?=.{6,20}$) 是一个积极的前瞻,它在匹配模式之前检查文本中是否有 6 到 20 个字符。如果少或多,则匹配失败。

    唯一的缺点是你只能用它显示一条错误消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-13
      • 1970-01-01
      相关资源
      最近更新 更多