日期:2014-05-17  浏览次数:20684 次

关于文本替换
有这样一段字符串(html代码):

<p>
  这是一篇文章,用来介绍金庸先生的一本<B>名著天龙八部</B>。天龙八部是金庸先生的一部著名唱片武侠小说……,天龙八部人物关系复杂……。
</p>


我需要做以下处理:

判断这段文字第一次出现“天龙八部”时,这四个是否处于<B></B>标记中,如果不处于则给这四个加上<B></B>标签;如果处于(上面例子就处于),则去判断第二次出现的地方是否处于<B></B>标记中……以此类推

给介绍一下怎么写效率最高。多谢~

------解决方案--------------------
Java code

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
Java code

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