使用正则表达式编码URL字符串

时间:2011-01-07 16:03:36

标签: java regex url

我正在尝试用不同的值替换几个不同的字符。例如,如果我有:#love hate,那么我想做的就是回来%23love%20hate

是否与群组有关?我试图理解使用群组,但我真的不明白。

6 个答案:

答案 0 :(得分:6)

您可以尝试这样做:

String encodedstring = URLEncoder.encode("#love hate","UTF-8");

它会为您提供所需的结果。要扭转它,你应该这样做:

String loveHate = URLDecoder.decode(encodedstring);

答案 1 :(得分:3)

您不需要RegEx来替换单个字符。 RegEx对于这些场所来说是一种过度杀伤力。对于要替换的每个字符,只需在循环中使用String类的普通替换方法即可。

String output = input.replace("#", "%23");
output = output.replace(" ", "%20");

您想要替换多少个这样的角色?

答案 2 :(得分:2)

如果您尝试将URL编码为utf-8,或者使用现有类进行某些编码会更容易

例如

commons-httpclient项目

  URIUtil.encodeWithinQuery(input,"UTF-8");

答案 3 :(得分:1)

不,你需要多次替换。另一种选择是使用group来查找下一个出现的几个字符串之一,检查字符串是什么并适当地替换,可能使用映射。

答案 4 :(得分:1)

我认为你想要实现的是一种url编码而不是纯粹的替换。

在SO的这个主题上看到一些答案,特别是那些有7票的人可能会对你更感兴趣。

HTTP URL Address Encoding in Java

答案 5 :(得分:1)

正如Mat所说,解决这个问题的最好方法是使用URLEncoder。但是,如果您坚持使用正则表达式,请参阅java.util.regex.Matcher.appendReplacement文档中的示例代码:

 Pattern p = Pattern.compile("cat");
 Matcher m = p.matcher("one cat two cats in the yard");
 StringBuffer sb = new StringBuffer();
 while (m.find()) {
     m.appendReplacement(sb, "dog");
 }
 m.appendTail(sb);
 System.out.println(sb.toString());

在循环中,您可以使用m.group()查看匹配的子字符串,然后根据该字符串进行自定义替换。这种技术可用于通过在地图等中查找$ {variables}来替换它们。