URL кодирует совпадающие группы

У меня есть регулярное выражение, которое соответствует заданному шаблону (очевидно, это то, что делают регулярное выражение) и заменяет этот шаблон тегом привязки и включает захваченную группу. Эта часть работает прекрасно.

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

Чего я не могу понять, так это того, как закодировать URL-адрес захваченной группы перед ее использованием в атрибуте href.

Пример ввода

  1. [[a]]
  2. [[a b]]
  3. [[a&b]]

желаемые результаты

  1. <a href="a">a</a>
  2. <a href="a+b">a b</a>
  3. <a href="a%26b">a&b</a>

Есть какой-либо способ сделать это? Я еще не нашел ничего полезного, хотя, когда я спрашиваю, я обычно нахожу ответ.


person antony.trupe    schedule 05.07.2011    source источник


Ответы (2)


Сначала замените все специальные символы на нужные,
затем сопоставьте их внутри двойного [ и замените в теге <a href=..>.

Это или извлеките часть URL внутри [ и передайте ее через URL encoder, прежде чем поместить в тег <a href=..>.

Кажется, что Java по умолчанию предлагает java.net.URLEncoder. Поэтому я думаю, что получение url из шаблона и передача через кодировщик, а затем размещение его в теге <a href=..> — ваш лучший выбор.

person c00kiemon5ter    schedule 05.07.2011
comment
да: P рад, что вы нашли решение;) - person c00kiemon5ter; 05.07.2011

Конечно, нет, нашел свой ответ. Начал с кода из Matcher.appendReplacement

Чистая джава:

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);

Вес:

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));
person antony.trupe    schedule 05.07.2011
comment
На самом деле мне приходится использовать com.google.gwt.http.client.URL, потому что я работаю на клиенте в gwt, но URLEncoder — это то, что будет использовать большинство людей, поэтому я оставлю его как есть. - person antony.trupe; 05.07.2011