#java #regex #validation
#java #регулярное выражение #проверка
Вопрос:
Я собираюсь добавить поддержку подстановочных знаков в свое приложение.
Оно должно соответствовать приведенному ниже требованию. Подстановочные знаки должны содержать:
- UTF-8 alphabetical characters
- .,*,^, ,?,$,[],[^],:,/
- Domain parts other than the last may begin with a digit(from RFCs)
Также пользователь может указать простое доменное имя как test.test
Идея заключалась в том, чтобы сделать это в два этапа:
-
Проверьте, соответствует ли подстановочный знак приведенному ниже шаблону:
^[\pL0-9\[\].^$?* :/]
. Если оно соответствует, попробуйте скомпилировать его как шаблон java. - Если оно не соответствует последнему регулярному выражению, предположим, что это простое доменное имя, и подтвердите его с помощью библиотеки 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] "