Регулярное выражение, используемое в шаблонной метааннотации для электронной почты, не работает, но работает где-то еще - PullRequest
1 голос
/ 22 октября 2019

Я хочу проверить список электронных писем с регулярным выражением через проверку 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

Что я делаю неправильно или чего не хватает для того, чтобы пользовательский валидатор работал? Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 22 октября 2019

Когда регулярное выражение становится сложным (и обычно это так), было бы хорошо организовать его примерно так. Используйте Java, чтобы сделать его немного легче.

    String email = "([A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64})";
    String comma = "\\s*,\\s*";
    String optionalComma = "\\s*,?\\s*";

    Pattern p = Pattern.compile("\\s*" + email + "(" + comma + email + ")*" + optionalComma);

Это работает в тестовом примере. Вам нужно будет расширить регулярное выражение в аннотации.

0 голосов
/ 23 октября 2019

Я пропустил аннотацию @Email, которая полезна только тогда, когда вам нужно проверить только одно письмо.

Дух!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...