java - 根据 RFC 3986 的无效 URI 示例

标签 java spring-mvc rfc3986

对于我的单元测试,我想找到一个无效 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 通过了正则表达式检查。

最佳答案

我想任何东西都会匹配那个正则表达式。问题是正则表达式没有严格执行 RFC。相反,它被设计为宽容的;即接受任何旧垃圾并尽最大努力将其解析为 URL。

(但是,我注意到它在解析非 HTTP URI 方面做得不好。看看 SCHEME_PATTERN ... 哭吧。)

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

关于java - 根据 RFC 3986 的无效 URI 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9460159/

相关文章:

spring-mvc - Grails 验证 delete() 操作?

javascript - 在 JavaScript 中解析相对 URL

java - 启动相机 Intent ,但不保存图像

java - 在 Spring Boot 应用程序中启动 ApplicationContext 时出错

java - JNI 和旧的 C++ 代码

java - Spring mvc @PathVariable 给出 'The request sent by the client was syntactically incorrect.'

http - URL "scheme plus authority"的正式名称

uri - 如果有的话,什么时候应该在 URL 中对像 { 和 } (大括号)这样的字符进行百分比编码?

JavaFX FileChooser 抛出错误(可能很容易修复,但仍然很困惑)

java - 使用 org.hibernate.validator.internal.cfg.context 创建方法约束