Java里面通过正则表达式来实现字符串替换
2008-08-21 09:38
1281 查看
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*
*/
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*
*/
相关文章推荐
- Java正则表达式实现字符串的动态多替换
- @V@ java代码笔记2010-06-12:java控制台输入各类型类实现;以及判断输入字符串里面是否有数字的两种方法:方法1:转换成字符数组;方法2:正则表达式。
- JAVA正则表达式替换字符串问题
- 字符串处理是许多程序中非常重要的一部分,它们可以用于文本显示,数据表示,查找键和很多目的.在Unix下,用户可以使用正则表达式的强健功能实现这些 目的,从Java1.4起,Java核心API就引入了java.util.regex程序包,它是一种有价值的基础
- Java通过正则表达式判断字符串当中是否有特殊符号
- Java正则表达式实现${name}形式的字符串模板
- Java 通过正则表达式实现简单xml文件解析
- java正则表达式替换字符串
- Java_正则表达式_按给定正则表达式分割或替换字符串
- Java用正则表达式实现${name}形式的字符串模板实例
- js正则表达式,实现字符串替换
- asp常用的正则表达式实现字符串的替换
- 通过正则表达式提取HTML正文(java实现)
- 特殊字符导致用正则表达式进行字符串替换失败,Java replaceAll()方法报错Illegal group reference
- asp常用的正则表达式实现字符串的替换
- Java中利用正则表达式将字符串中斜杠替换成双斜杠
- asp常用的正则表达式实现字符串的替换
- Java通过正则表达式获取字符串中数字的方法示例
- java中的正则表达式 字符串的拆分,匹配,替换
- JAVA通过正则表达式实现EXCEL小插件取文本功能