Пример неверного 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, Регулярные выражения не являются подходящим инструментом для этой задачи.

Другие вопросы по тегам