Java里面通过正则表达式来实现字符串替换

import java.text.MessageFormat;
import java.util.regex.*;

/**
*
* 通过正则表达式来实现字符串替换(2008-08-21)
* 可以实现动态地赋值替换、可以实现对匹配值的部分替换。
* 例子查看main()函数
* @version 1.0  coolmasoft.com
* @author coolma
*
*
*/
public class RegularReplace
{

    private String content;
    private String regexp;
    private String format;
    Matcher m =null;
    StringBuffer buf = new StringBuffer();
    MessageFormat fmt =null;
    boolean b=false;
    Object[] values=null;
    int pointer=0;
    public RegularReplace(String content,String regexp)
    {
        this(content,regexp,"");
    }
    public RegularReplace(String content,String regexp,String format)
    {
        this.content=content;
        this.regexp=regexp;
        this.format=format;
        m=Pattern.compile(regexp).matcher(content);
        fmt = new MessageFormat(format);
        pointer=0;
    }
    public void reset()
    {
        m.reset();
        buf = new StringBuffer();
        pointer=0;
    }
    public String replaceAll(String newvalue)
    {
        return m.replaceAll(newvalue);
    }
    public String replaceAll(int group,String newvalue)
    {
        reset();
         while(find())
         {
             setGroup(group,newvalue);
             replace();
         }
         return getResult();
    }
    public boolean find()
    {
        boolean b= m.find();
        values=new Object[m.groupCount()+1];
        return b;
    }
    public void replace(Object[] obj)
    {  
        // System.out.println(format);
        replace( fmt.format(obj));//
    }
    public void replace(String s)
    {    
        //m.appendReplacement(buf, s);//
        buf.append( content.substring(pointer,m.start()));
        buf.append(s );
        pointer=m.end();
    }
    public int groupCount()
    {
      return m.groupCount();
    }
    public void setGroup(int i ,Object o)
    {
        values[i]=o;
    }
    public void replace()
    {
        //先排除重叠的group
        for(int i=1;i< values.length;i++)
        {
            if(values[i]==null) continue;
            int start=m.start(i);
            int end=m.end(i);
            for(int k=0;k<i;k++)
            {
                if(values[k]==null) continue;
                if(start>=m.start(k)&& start<m.end(k))
                {
                    values[i]=null; //设置为空,则不管这个group
                    //System.out.println("values[i]"+i);
                    break;
                }
            }
        }
        for(int i=0;i< values.length;i++)
        {
            if(values[i]==null) continue;
            int start=m.start(i);
            int end=m.end(i);
            //System.out.println("pointer="+pointer+"start="+start+"end="+end);
            buf.append( content.substring(pointer,start));
            buf.append(values[i] );
            pointer=end;
        }
    }
    public String getResult()
    {
        if(!b)
        {
            //m.appendTail(buf);
            buf.append(content.substring(pointer));
            b=true;
        }
        return buf.toString();
    }
    public static void main(String[] args)
    {
        //-- 全部替换为一常量 ,和String.replaceAll()一致
        RegularReplace rr=new RegularReplace("a1b2c3d3e3","[^c]3");
        System.out.println(rr.replaceAll("-"));
        //-- 全部替换某一组为一常量 (注意 group=0表示整个匹配串,从group=1开始才是真正的组
        rr=new RegularReplace("*abc*abc*","a(b)(c)");
        System.out.println(rr.replaceAll(1,"-"));
        //-- 全部替换为动态值
        rr=new RegularReplace("*abc*abc*","a(b)(c)");
        int n=0;
        while(rr.find())
        {
            rr.replace("ME"+n);
            n++;
        }
        System.out.println(rr.getResult());
        //-- 全部替换某几个组为动态值
        rr=new RegularReplace("*abc*abc*","a(b)(c)");
        while(rr.find())
        {
            rr.setGroup(1, "B"+n);
            rr.setGroup(2, "C"+n);
            rr.replace();
            n++;
        }
        System.out.println(rr.getResult());
    }
}

 

/*

运行的输出结果:

a1b2c3--
*a-c*a-c*
*ME0*ME1*
*aB2C2*aB3C3*

 

*/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值