4

私の単体テストではUriComponentsBuilder#URI_PATTERN、Spring MVC 3.1.1 の正規表現と一致しない無効な URI の例を見つけたいと思います。

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 として渡します。

4

1 に答える 1

3

何でもその正規表現に一致すると思います。問題は、正規表現が RFC を厳密に実装していないことです。むしろ、寛容になるように設計されています。つまり、古いゴミを受け入れて、それを URL として解析するために最善を尽くします。

(ただし、HTTP 以外の URI を解析するのにまともな仕事をしないことに注意してください SCHEME_PATTERN。... を見て、泣いてください。)

URI の厳密な解析または検証を行いたい場合は、java.net.URI. 正規表現は、このタスクに適したツールではありません。

于 2012-02-27T05:30:15.657 に答える