如何允许正则表达式为空?

How can I allow a regex to be blank?

我正在尝试制作一个只接受有效电子邮件或空白电子邮件的表单。我认为这将是这样的:

EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i OR ""
validates :email, format: { with: EMAIL_REGEX }

或者也许

EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
BLANK_REGEX = 
validates :email, format: { with: EMAIL_REGEX OR BLANK_REGEX }

但我想不出正确的语法。有谁知道这样做的正确方法吗?

只需将您的正则表达式设为可选,即可使您的正则表达式也匹配空白电子邮件。

EMAIL_REGEX = /\A(?:[\w+\-.]+@[a-z\d\-.]+\.[a-z]+)?\z/i

EMAIL_REGEX = /^(?:[\w+\-.]+@[a-z\d\-.]+\.[a-z]+)?$/i

要使正则表达式可选,请将整个正则表达式包含在非捕获组中 (?:...),然后在该组旁边添加一个 ?

@avinash-raj 指出的方法是完美的。但是,您可以在验证中使用 allow_blank: true 。你的代码应该是这样的:

validates :email, format: { with: /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i}, allow_blank: true