URL кодировать совпадающие группы - PullRequest
3 голосов
/ 05 июля 2011

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

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>

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

Ответы [ 2 ]

0 голосов
/ 05 июля 2011

Конечно, нашел мой ответ. Начинается с кода из 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));
0 голосов
/ 05 июля 2011

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

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

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

...