要求:字符串“richText”,可以包含纯文本+ anchor 标记。重写anchor标签,修改其target,追加JS等
问题: 模式匹配器 find() 和appendReplacement() 工作正常,直到 anchor 标记中没有特殊字符 "$" 。当 $ 是 anchor 标记的一部分时,它会抛出异常。
第 1 行修复了异常部分,但如果“$”或“\”以纯文本形式出现,则会产生问题,因为纯文本现在有额外的转义字符上述 2 个特殊字符(quoteReplacement() 的 bcoz)。如何从纯文本中去除额外的转义字符(撤消 quoteReplacement 的影响)?
方法:
String richText = Matcher.quoteReplacement(rText); //Line 1-escape characters
String anchorTagPattern = "<a[^>]*?href\\s*=[^>]*>(.*?)</a>";
StringBuffer result = new StringBuffer(richText.length());
Pattern pattern = Pattern.compile(anchorTagPattern);
Matcher matcher = pattern.matcher(richText);
while (matcher.find()) {
String aTag = matcher.group();
.......
String formattedAnchorTag = rewriteTag(aTag);
matcher.appendReplacement(result, formattedAnchorTag); ....
}
matcher.appendTail(result);
//Plain text with $ \ has some additional escape characters because of Line 1. How to remove them:
输入的rText是
Plain text having $. Anchor tag to be rewritten is <a href=\"http://www.google.com\">google$</a>
如果方法中的 Line1-quoteReplacement 被注释,那么我会得到java.lang.IllegalArgumentException:非法组引用 在 java.util.regex.Matcher.appendReplacement(Matcher.java:724)
如果我离开它,异常就会消失,但返回的字符串是
Plain text having \$. Anchor tag to be rewritten is <a href="http://www.google.com" target="_blank">google$</a>
最佳答案
不应在 rText
上调用
Matcher.quoteReplacement
。模式中的第一个问号似乎是多余的。只有 rewriteTag
可能是原因。
formattedAnchorTag = Matcher.quoteReplacement(formattedAnchorTag);
matcher.appendReplacement(result, formattedAnchorTag);
关于Java正则表达式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9708738/