url编码匹配的组

时间:2011-07-05 01:27:07

标签: java regex urlencode

我有一个匹配给定模式的正则表达式(很明显,这就是正则表达式的作用)并用锚标记替换该模式并包含一个捕获的组。那部分很可爱。

String substituted = content.asString().replaceAll("\\[{2}((?:.)*?)\\]{2}",
                                       "<a href=\"#!p\\:$1\">$1</a>");

我无法弄清楚在href属性中使用它之前如何对捕获的组进行url编码。

示例输入

  1. [[a]]
  2. [[a b]]
  3. [[a&b]]
  4. 期望的输出

    1. <a href="a">a</a>
    2. <a href="a+b">a b</a>
    3. <a href="a%26b">a&b</a>
    4. 有没有办法做到这一点?我还没有找到任何看起来有用的东西,不过一次我问我通常会找到答案。

2 个答案:

答案 0 :(得分:0)

将所有特殊字符替换为您想要的字符,
然后在双[内匹配,并将其替换为<a href=..>标记。

那,或者在[中提取网址部分并将其传递到URL encoder,然后再将其放入<a href=..>标记中。

Java似乎默认提供java.net.URLEncoder。因此,我认为从模式中获取 url ,然后通过编码器,然后将其放在<a href=..>标记中是您的最佳选择。

答案 1 :(得分:0)

当然,找到我的答案。 从Matcher.appendReplacement

的代码开始

纯java:

Pattern p = Pattern.compile("\\[{2}((?:.)*?)\\]{2}" );
Matcher m = p.matcher(content.asString());
StringBuffer sb = new StringBuffer();
while (m.find()) {
    String one = m.group(1);
    try {
        m.appendReplacement(sb, "<a href=\"#!p\\:"+URLEncoder.encode(one,"UTF-8")+"\">$1</a>");
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
m.appendTail(sb);

GWT:

RegExp p = RegExp.compile("\\[{2}((?:.)*?)\\]{2}", "g");
MatchResult m;
StringBuffer sb = new StringBuffer();
int beginIndex = 0;
while ((m = p.exec(content.asString())) != null) {
    String one = m.getGroup(1);
    int endIndex = m.getIndex();

    sb.append(content.asString().substring(beginIndex, endIndex));

    sb.append("<a href=\"#!p:" + URL.encode(one) + "\">" + one + "</a>");

    beginIndex = p.getLastIndex();
}

sb.append(content.asString().substring(beginIndex));