Я хочу проверить список электронных писем с регулярным выражением через проверку bean-компонента Spring. Действительный список сообщений электронной почты выглядит следующим образом:
- someone@mail.xxx, someother@mail.xxx, anotherone@mail.xxx
- someone@mail.xxx, someother @ mail.xxx, anotherone @ mail.xxx,
- someone@mail.xxx, someother @ mail.xxx,
anotherone@mail.xxx
Недопустимый список может выглядеть следующим образом:
- some one@mail.xxx someother@mail.xxx, anotherone @ mail.xxx
- , somebody@mail.xxx someother@mail.xxx, anotherone @ mail.xxx
Имя пользователя действительного электронного письма - это последовательность символов, отличная от пробела и новой строки. То же самое относится к имени домена и суффиксу домена.
Кроме того, количество пробелов или новых строк между фактическим письмом и его предыдущей или следующей запятой не имеет значения, но не может быть ни пробелов, ни новых строк вфактические электронные письма.
Я следую советам других действительно полезных ответов, чтобы предоставить собственный валидатор, и у меня есть этот:
@Email(message = "Please provide a list of valid email addressess")
@Pattern(regexp = "((( |\\n| \\n))*[^ \\n]+@[^ \\n]+\\.[^ \\n]+(( |\\n| \\n))*,*(( |\\n| \\n))*)+", flags = Flag.CASE_INSENSITIVE, message = "Please provide a list of valid email addresses")
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE })
@Retention(value = RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {})
@Documented
public @interface ExtendedEmailListValidator {
String message() default "Please provide a list of valid email addresses";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
Однако все списки адресов электронной почты не совпадают, кроме случаясписка только с одним элементом.
Попытка хотя бы доказать некоторые базовые списки с установленным шаблоном / сопоставителем, например, так:
String input = "";
Matcher m = null;
Pattern p = Pattern.compile("((( |\\n| \\n))*[^ \\n]+@[^ \\n]+\\.[^ \\n]+(( |\\n| \\n))*,*(( |\\n| \\n))*)+");
input = "someone@mail.xxx";
m = p.matcher(input);
System.out.println(input + ": " + m.matches());
input = "someone@mail.xxx, anotherone@mail.xxx";
m = p.matcher(input);
System.out.println(input + ": " + m.matches());
input = "someone@mail.xxx,anotherone@mail.xxx";
m = p.matcher(input);
System.out.println(input + ": " + m.matches());
input = "someone@mail.xxx, an other one@mail.xxx";
m = p.matcher(input);
System.out.println(input + ": " + m.matches());
input = "someone@ma il.xxx, anotherone@mail.xxx";
m = p.matcher(input);
System.out.println(input + ": " + m.matches());
и вывод будет таким, как ожидалось:
someone@mail.xxx: true
someone@mail.xxx, anotherone@mail.xxx: true
someone@mail.xxx,anotherone@mail.xxx: true
someone@mail.xxx, an other one@mail.xxx: false
someone@ma il.xxx, anotherone@mail.xxx: false
Что я делаю неправильно или чего не хватает для того, чтобы пользовательский валидатор работал? Заранее спасибо!