索引65处路径中的非法字符异常[java]

索引65处路径中的非法字符异常[java],java,regex,url,exception-handling,web-crawler,Java,Regex,Url,Exception Handling,Web Crawler,我试图使用HTTPGET apache方法获取页面,但它引发了以下异常: Illegal character in path at index 65: http://doctorat.tuiasi.ro/Htm/Proiecte_POSDRU_17.02.2013/Proiecte europene.html 我知道空间可能是问题的原因,但我正在尝试像那样过滤url String url=everyUrl.getUrl().replaceAll(" ", "%20");

我试图使用HTTPGET apache方法获取页面,但它引发了以下异常:

Illegal character in path at index 65: http://doctorat.tuiasi.ro/Htm/Proiecte_POSDRU_17.02.2013/Proiecte europene.html
我知道空间可能是问题的原因,但我正在尝试像那样过滤url

String url=everyUrl.getUrl().replaceAll(" ", "%20");
                if (url.contains("http://")) {
                    Pattern allowedUrlCharacters = Pattern
                            .compile("([A-Za-z0-9_.~:/?\\#\\[\\]@!$&'()*+,;" + "=-]|%[0-9a-fA-F]{2})+");
                    Matcher matcher = allowedUrlCharacters.matcher(url);
                    if (matcher.find()) {
                        pushInFrontQueues(url);
                    }
                    // System.out.println(this.frontQueues.get(0).size());

                }
            }

我做错了什么?有人能帮我吗?

问题是,您的正则表达式正在查找有效字符串。事实上,它正在查找两个有效字符串。看看我的意思。它找到了两个匹配的组

您需要确保仅当整个字符串匹配时才匹配。您可以用
^
$
包围正则表达式,如下所示:

"^([A-Za-z0-9_.~:/?\\#\\[\\]@!$&'()*+,;" + "=-]|%[0-9a-fA-F]{2})+$"
但是,此模式可能会匹配您不想要的内容,例如
something%2else
。要仅允许有效的百分比编码,您可能需要以下内容:

"^(%[0-9a-fA-F]{2}|[^%][A-Fa-f0-9]|[G-Zg-z_.~:/?\\#\\[\\]@!$&'()*+,;=-])+$"

什么是完整堆栈跟踪?在代码的哪一行发生异常?URL中不允许使用空格。你在“Proiecte europene.html”@riannel中有一个是完整堆栈的tracese@litelite,我知道,但我已经测试了id,不应该通过测试,但它是真的,我不知道为什么我不尝试修复正则表达式。我更新了答案。在答案中添加了更好的正则表达式。