Средство проверки домена с подстановочными знаками

#java #regex #validation

#java #регулярное выражение #проверка

Вопрос:

Я собираюсь добавить поддержку подстановочных знаков в свое приложение.

Оно должно соответствовать приведенному ниже требованию. Подстановочные знаки должны содержать:

  - UTF-8 alphabetical characters
 - .,*,^, ,?,$,[],[^],:,/
 - Domain parts other than the last may begin with a digit(from RFCs)
  

Также пользователь может указать простое доменное имя как test.test

Идея заключалась в том, чтобы сделать это в два этапа:

  1. Проверьте, соответствует ли подстановочный знак приведенному ниже шаблону:

    ^[\pL0-9\[\].^$?* :/] . Если оно соответствует, попробуйте скомпилировать его как шаблон java.

  2. Если оно не соответствует последнему регулярному выражению, предположим, что это простое доменное имя, и подтвердите его с помощью библиотеки Google com.google.common.net.InternetDomainName

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

В качестве примера, когда я указал домен следующим образом: test.10 он соответствует шаблону, но не соответствует третьим требованиям, касающимся цифр в доменах.

Было бы хорошо, если бы ваше предложение объясняло, как я могу выполнить все определенные требования. Также было бы полезно узнать лучшее решение в таких случаях.

Комментарии:

1. (^[\pL0-9\[\].^$?* :/] \.)?^[\pL\[\].^$?* :/]

2. Спасибо за быстрый ответ. Я попробовал твою скороговорку. Но, к сожалению, это работает не так, как ожидалось. Таким образом, оно не соответствует следующим доменам, которые считаются допустимыми с третьим требованием: 10test.com , test.10test.com

Ответ №1:

Если последняя часть домена не должна содержать никаких чисел:

 ^(?:[p{L}p{Nd}x2Ax2Bx2Fx3Ax3Fx5Bx5Dx5E] [x2E]) [p{L}x2Ax2Bx2Fx3Ax3Fx5Bx5Dx5E] $
  

Приведенное выше регулярное выражение в виде строки Java:

 "^(?:[\p{L}\p{Nd}\x2A\x2B\x2F\x3A\x3F\x5B\x5D\x5E] [\x2E]) [\p{L}\x2A\x2B\x2F\x3A\x3F\x5B\x5D\x5E] $"
  

Если только первый символ последней части домена не должен быть числом:

 (?:[p{L}p{Nd}x2Ax2Bx2Fx3Ax3Fx5Bx5Dx5E] [x2E]) [p{L}x2Ax2Bx2Fx3Ax3Fx5Bx5Dx5E][p{L}p{N}x2Ax2Bx2Fx3Ax3Fx5Bx5Dx5E] 
  

Приведенное выше регулярное выражение в виде строки Java:

 "(?:[\p{L}\p{Nd}\x2A\x2B\x2F\x3A\x3F\x5B\x5D\x5E] [\x2E]) [\p{L}\x2A\x2B\x2F\x3A\x3F\x5B\x5D\x5E][\p{L}\p{N}\x2A\x2B\x2F\x3A\x3F\x5B\x5D\x5E] "