Java 根据RFC 3986的无效URI示例

Java 根据RFC 3986的无效URI示例,java,spring-mvc,rfc3986,Java,Spring Mvc,Rfc3986,对于我的单元测试,我想找到一个无效URI的示例,它将无法匹配Spring MVC 3.1.1中的UriComponentsBuilder#URI_模式regex: private static final String SCHEME_PATTERN = "([^:/?#]+):"; private static final String HTTP_PATTERN = "(http|https):"; private static final String USERINFO_PATTERN =

对于我的单元测试,我想找到一个无效URI的示例,它将无法匹配Spring MVC 3.1.1中的
UriComponentsBuilder#URI_模式
regex:

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()
illegargumentexception
而失败。我尝试的任何东西都会将正则表达式检查作为有效URI通过。

我认为任何东西都会匹配该正则表达式。问题是正则表达式没有严格实现RFC。相反,它的设计是允许的;i、 接受任何旧的垃圾,并尽最大努力将其解析为URL

(然而,我注意到它不能很好地解析非HTTP URI


如果您想对URI进行严格的解析或验证,最好使用
java.net.URI
。regex不是执行此任务的合适工具。

它们的HTTP URL模式更严格:
私有静态最终模式HTTP\u URL\u pattern=pattern.compile(“^”+HTTP\u pattern+”(/(“+USERINFO\u pattern+”)?“+HOST\u pattern+”(:“+PORT\u pattern+”?+”)?“+PATH\u pattern+”(\\?“+LAST\u pattern+”))它不接受奇怪的
片段
部分,你认为这是一个bug吗?“你认为这是一个bug吗?”-你需要与Spring MVC开发人员争论一下。我的看法是,使用正则表达式进行URL/URI解析是一大堆错误。不要这样做。