关于文本替换
有这样一段字符串(html代码):
<p>
这是一篇文章,用来介绍金庸先生的一本<B>名著天龙八部</B>。天龙八部是金庸先生的一部著名唱片武侠小说……,天龙八部人物关系复杂……。
</p>
我需要做以下处理:
判断这段文字第一次出现“天龙八部”时,这四个是否处于<B></B>标记中,如果不处于则给这四个加上<B></B>标签;如果处于(上面例子就处于),则去判断第二次出现的地方是否处于<B></B>标记中……以此类推
给介绍一下怎么写效率最高。多谢~
[解决办法]
public static void main(String[] args) { String str1 = "<p>这是一篇文章,用来介绍金庸先生的一本<B>名著天龙八部</B>。天龙八部是金庸先生的一部著名唱片武侠小说……,天龙八部人物关系复杂……。</p>"; List<String> lists = new ArrayList<String>(); Pattern p = Pattern.compile("<B>.*?</B>"); Matcher m = p.matcher(str1); while(m.find()){ String tmp = m.group(); lists.add(tmp); str1 = str1.replaceFirst("<B>.*?</B>", "---"); } str1 = str1.replaceAll("天龙八部", "<B>天龙八部</B>"); for(String ele:lists){ str1 = str1.replaceFirst("---", ele); } System.out.println(str1); }
[解决办法]
for example
String s = "<p>这是一篇文章,用来介绍金庸先生的一本<B>名著天龙八部</B>。天龙八部是金庸先生的一部著名唱片武侠小说……,天龙八部人物关系复杂……。</p>";String keyword = "天龙八部";boolean ok = false;Pattern p = Pattern.compile("(?i)<b>(.*?)</b>");Matcher m = p.matcher(s);List<int[]> list = new ArrayList<int[]>();while (m.find()) { if (m.group(0).contains(keyword)) { list.add(new int[]{m.start(), m.end()}); } if (keyword.equals(m.group(1))) { ok = true; break; }}if (! ok) { int index = s.indexOf(keyword); while (index >= 0) { ok = true; for (int[] idx : list) { if (index > idx[0] && index < idx[1]) { ok = false; } } if (ok) { s = s.substring(0, index-1) + "<B>" + keyword + "</B>" + s.substring(index+keyword.length()); break; } index = s.indexOf(keyword, index+1); }}System.out.println(s);