我有一个匹配给定模式的正则表达式(很明显,这就是正则表达式的作用)并用锚标记替换该模式并包含一个捕获的组。那部分很可爱。
String substituted = content.asString().replaceAll("\\[{2}((?:.)*?)\\]{2}",
"<a href=\"#!p\\:$1\">$1</a>");
我无法弄清楚在href属性中使用它之前如何对捕获的组进行url编码。
示例输入
[[a]]
[[a b]]
[[a&b]]
期望的输出
<a href="a">a</a>
<a href="a+b">a b</a>
<a href="a%26b">a&b</a>
有没有办法做到这一点?我还没有找到任何看起来有用的东西,不过一次我问我通常会找到答案。
答案 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));