需要一种接受多封电子邮件的模式

时间:2011-12-13 14:34:55

标签: java regex

我正在使用java regex包来验证电子邮件,如下所示:

Pattern p = Pattern.compile("^[ _A-Za-z0-9-]+(\\.[ _A-Za-z0-9-]+)*@" 
                          + "[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,4})$");

此模式适用于接受一个电子邮件投掷文本框。但是,现在我需要一个模式来验证用逗号分隔的多个电子邮件。

任何人都可以告诉我这种模式吗?

2 个答案:

答案 0 :(得分:1)

如下所示:

String regex = "[ _A-Za-z0-9-]+(\\.[ _A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,4})";

Pattern p = Pattern.compile("^(?:" + regex + "\\s*,\\s* + ")*" + regex + "$");

或者,首先使用split("\\s*,\\s*")拆分字符串,然后遍历数组并使用您的模式验证每个电子邮件地址。

答案 1 :(得分:0)

根据您的question history,您似乎需要JSF <h:inputText> component。我强烈建议寻找一种不同且更强大的方法。

在JSF中,绝对不应该在托管bean操作方法内部进行验证,而是在完全Validator实现中进行验证。在那里你可以单独检查每个邮件地址。

@FacesValidator("mailAddressesValidator")
public class MailAddressesValidator implements Validator {

    private static final Pattern PATTERN = Pattern.compile("([^.@]+)(\\.[^.@]+)*@([^.@]+\\.)+([^.@]+)");

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) {
        if (value == null) {
            return;
        }

        String[] mailAddresses = (String[]) value;
        List<FacesMessage> messages = new ArrayList<FacesMessage>();        

        for (String mailAddress : mailAddresses) {
            if (!PATTERN.matcher(mailAddress).matches()) {
                messages.add(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Invalid mail address format: " + mailAddress, null));
            }
        }

        if (!messages.isEmpty()) {
            throw new ValidatorException(messages);
        }
    }
}

按如下方式使用:

<h:inputText value="#{bean.mailAddresses}" validator="mailAddressesValidator" />

请注意,对于“无效字符”,该模式更宽松,因为电子邮件地址中的非拉丁字符,例如西里尔字母,希伯来文,梵文,中文等,有效!您可以根据业务需求将其更改为与单个邮件地址匹配的其他模式。