===========================
    Resource Link
===========================
It is based on xml & RegularExpressions tech.
about xml & regularExpression u can find them here:http://www.w3.org/XML/     
http://xml.apache.org
http://www.meurrens.org/ip-Links/java/regex/navi.html
http://www.savarese.org/oro/
http://jakarta.apache.org/oro
about ubb u can find them here:
http://www.ubbdesign.com========================
it used :
    jakarta-regexp-1.2              (download form http://jakarta.apache.org)
    dom4j-0.6(over 0.6 version)     (download form http://sourceforge.net)
    jdk(over 1.2 version)           (download form http://java.sun.com)==========================
        UBB.XML
it must be stored in CLASSPATH
==========================
the regularExpression & replace string map file.
<!--============================--><?xml version="1.0" encoding="UTF-8"?>
<UBB-map>
    <map ubb-code="\[b\](.+?)\[\/b\]" map-to="<b>$1</b>"/>         <!--<b>$1</b>-->
    <map ubb-code="\[i\](.+?)\[\/i\]" map-to="<i>$1</i>"/>         <!--<i>$1</i>-->
    <map ubb-code="\[h1\](.+?)\[\/h1\]" map-to="<h1>$1</h1>"/>     <!--<h1>$1</h1>-->
    <map ubb-code="\(.+?)\[\/url\]" map-to="<a href="$1" target="_blank">$2</a>"/>        <!--<a href="$1" target="_blank">$2</a>-->
    <!--...-->
</UBB-map>=========================        UBB.java=========================/*
* UBB.java
*
* Created on 2001年9月3日, 下午4:01
*/package com.wacos.util.ubb;import org.dom4j.*;
import org.dom4j.io.*;
import java.io.*;
import java.util.*;
import org.apache.regexp.*;
/**
*
* @author  Pizer.chen -- iceant -- 陈鹏
* @version 0.1
*/
public class UBB {
    
    private static final String XML_CONFIG_FILE = "UBB.xml";
    private static org.dom4j.Document doc = null;
     
    /** Creates new UBB */
    public UBB() {
    }
    
    public static String parse(String inStr){
        try{
            List list = getUBBCodeList();
            String ubbCode="";
            String mapStr="";
            Attribute attribute=null;
            for (Iterator iter = list.iterator(); iter.hasNext(); ) {
                attribute = (Attribute) iter.next();
                ubbCode = attribute.getValue();
                mapStr= getMapValue(ubbCode);
                inStr=REReplace.replace(ubbCode,mapStr,inStr);
            }
            return inStr;
        }catch(Exception err){
            System.out.println(err);
            return err.toString();
        }
    }    /**
     * parse the xml file to Document object
    **/
    private static Document xml2Document(){
        try{
            InputStream is = Thread.currentThread().getContextClassLoader()
                            .getResourceAsStream(XML_CONFIG_FILE);
            SAXReader reader = new SAXReader();
            Document document = reader.read(is);
            return document;
        }catch(Exception err){
            System.out.println(err);
            return null;
        }
    }    /**
     * use xpath to get the map-to value of the ubb-code.
    **/
    private static String getMapValue(String ubbCode){
        try{
            if(doc==null){
                doc=xml2Document();
            }
            Node node = doc.selectSingleNode("//map[@ubb-code='"+ubbCode+"']");
            return node.valueOf( "@map-to" );
        }catch(Exception err){
            System.out.println(err);
            return err.toString();
        }
    }
    /**
     * get the <map ubb-code="..." map-to=".."> ubb-code List
    **/
    private static List getUBBCodeList(){
        try{
            if(doc==null){
                doc=xml2Document();
            }
            return doc.selectNodes( "//map/@ubb-code" );
        }catch(Exception err){
            System.out.println(err);
            return null;
        }
    }
    /**
     * get the <map ubb-code="..." map-to=".."> map-to List
    **/
    private static List getUBBMapList(){
        try {
            if(doc==null){
                doc=xml2Document();
            }
            return doc.selectNodes("//map//@map-to");
        }
        catch (Exception e) {
            System.out.println(e);
            return null;
        }
    }
}========================     REReplace.java========================
package com.wacos.util.ubb;import java.io.*;
import java.util.*;
import org.apache.regexp.*;public class REReplace 
{
    /**
     * replace the inStr with pattern1 & pattern2
    **/
    public static String replace(String pattern1,String pattern2,String inStr){
        try {
            RE re = new RE(pattern1);
            int point=0;
            while(re.match(inStr)){
                RE re2 = new RE("\\$([0-9])");
                while(re2.match(pattern2)){
                    point = Integer.parseInt(re2.getParen(1));
                    pattern2=re2.subst(pattern2,re.getParen(point),RE.REPLACE_FIRSTONLY);
                }
                inStr = re.subst(inStr,pattern2);
            }
            return inStr;
        }
        catch (Exception e) {
            System.out.println(e);
            return e.toString();
        }  
    }}
=============================
        UBBTest
=============================
package com.wacos.util.ubb;public class UBBTest 
{
    public static void main(String[] args) 
    {
        try{
            String test ="atest H1 Font
\r\n [url href=http://www.21cn.com]测试hehe..";            System.out.println(UBB.parse(test));
        }catch(Exception err){
            System.out.println(err);
        }
    }
}