Пример неверного URI согласно RFC 3986
Для моего модульного теста я хотел бы найти пример недопустимого URI, который не будет соответствовать UriComponentsBuilder#URI_PATTERN
регулярное выражение из Spring MVC 3.1.1:
private static final String SCHEME_PATTERN = "([^:/?#]+):";
private static final String HTTP_PATTERN = "(http|https):";
private static final String USERINFO_PATTERN = "([^@/]*)";
private static final String HOST_PATTERN = "([^/?#:]*)";
private static final String PORT_PATTERN = "(\\d*)";
private static final String PATH_PATTERN = "([^?#]*)";
private static final String QUERY_PATTERN = "([^#]*)";
private static final String LAST_PATTERN = "(.*)";
// Regex patterns that matches URIs. See RFC 3986, appendix B
private static final Pattern URI_PATTERN = Pattern.compile(
"^(" + SCHEME_PATTERN + ")?" + "(//(" + USERINFO_PATTERN + "@)?" + HOST_PATTERN + "(:" + PORT_PATTERN +
")?" + ")?" + PATH_PATTERN + "(\\?" + QUERY_PATTERN + ")?" + "(#" + LAST_PATTERN + ")?");
Я изо всех сил пытаюсь найти единственную строку, которая вызовет UriComponentsBuilder.fromUriString()
потерпеть неудачу с IllegalArgumentException
, Все, что я пробую, проходит проверку на регулярное выражение как действительный URI.
1 ответ
Я думаю, что все будет соответствовать этому регулярному выражению. Проблема в том, что регулярное выражение не выполняет строго RFC. Скорее это разработано, чтобы быть разрешающим; т.е. принять любой старый мусор и сделать все возможное, чтобы разобрать его как URL.
(Тем не менее, я отмечаю, что он не справится с задачей анализа URI, не относящихся к HTTP. Посмотрите на SCHEME_PATTERN
... и плачем.)
Если вы хотите выполнить строгий анализ или проверку URI, лучше использовать java.net.URI
, Регулярные выражения не являются подходящим инструментом для этой задачи.