RFC 3986规定的无效URI示例

4

为了进行单元测试,我想找一个无效的 URI 示例,该示例无法与 Spring MVC 3.1.1 中的 UriComponentsBuilder#URI_PATTERN 正则表达式匹配:

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个回答

3

我认为任何内容都会匹配这个正则表达式。问题在于该正则表达式不严格遵守RFC规范。相反,它被设计成宽容的;即接受任何旧的垃圾,并尝试将其解析为URL。

(但是,我注意到它不能很好地解析非HTTP URI。看看SCHEME_PATTERN……然后哭泣吧。)

如果您想要对URI进行严格解析或验证,则最好使用java.net.URI。正则表达式不是这项任务的正确工具。


它们的HTTP URL模式更加严格:private static final Pattern HTTP_URL_PATTERN = Pattern.compile( "^" + HTTP_PATTERN + "(//(" + USERINFO_PATTERN + "@)?" + HOST_PATTERN + "(:" + PORT_PATTERN + ")?" + ")?" + PATH_PATTERN + "(\\?" + LAST_PATTERN + ")?"); - parxier
它不接受“片段”部分,这很奇怪,你认为这是一个错误吗? - parxier
1
“你认为这是一个 bug 吗?” - 这个问题需要你和 Spring MVC 的开发者进行讨论。我的看法是,使用正则表达式来解析 URL/URI 是一堆 bug 的来源。最好不要这样做。 - Stephen C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接