java使⽤正则表达式匹配,并修改⽂件内容(保留原⽂件格
式)
⽬录
概述
需求是:有很多需要修改的⽂件,利⽤正则表达式匹配修改这些⽂本,并保存。
⽂末有完整的代码下载地址和完整代码贴出来。
实现的功能
1. 实现赛选出指定⽂件夹中的xml⽂件(也可以更改为其他的)
2. 实现了将xml中的内容取出存在stringbuffer中,在对其进⾏修改
3. ⽤正则表达式匹配指定的内容,然后修改替换指定的内容,并写⼊⽂件
效果图
可以看见,所有xml⽂件都被修改了。
修改前
修改后
代码
需要导⼊的包
import java.io.*;
import Matcher;
import Pattern;
查指定后缀⽂件
⾸先写了⼀个内部类,⽤来过滤指定⽂件夹中的指定后缀的⽂件。
//匹配.xml后缀⽂件内部类
public class FileFilter implements FilenameFilter
{
private String filterRule;
public FileFilter(String filter)
{
this.filterRule = filter;
}
@Override
public boolean accept(File dir, String name) {
if(name.lastIndexOf('.')>0)
{
// get last index for '.' char
int lastIndex = name.lastIndexOf('.');
// get extension
String str = name.substring(lastIndex);
// match path name extension
if(str.equals(this.filterRule))
{
return true;
}
}
return false;
}
}
调⽤⽅式
FilenameFilter fileNameFilter = fileFilter .new FileFilter(".xml") ;
指定⽂件匹配替换内容
replace主要是接收:
1.需要修改的⽂件路径
2.正则表达式的匹配规则
3.需要写⼊的内容
/*
替换⽂件内容
传递的参数1.path⽂件路径,
2.patString:正则表达式(需要匹配的内容)
3.需要替换的内容
*/
public static void replace(File path,String patString2,String replacement2) {
// 正则表达式
String patt = patString2;
// 测试的输⼊字符串
String str="";
File file=path;
try {
FileInputStream in=new FileInputStream(file);
// size 为字串的长度,这⾥⼀次性读完
int size=in.available();
byte[] buffer=new byte[size];
in.close();
str=new String(buffer,"UTF-8");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//System.out.println("读取到⽂件的信息为-----------------------------------:" + str);
// 从正则表达式实例中运⾏⽅法并查看其如何运⾏
Pattern r = Patternpile(patt,Pattern.CASE_INSENSITIVE);
Matcher m = r.matcher(str);
//System.out.println("替换成的⽂件为----------------------------------------------------:" + m.replaceAll("favour")); // appendReplacement⽅法
StringBuffer sb = new StringBuffer();
while (m.find()) {
// 将匹配之前的字符串复制到sb
m.appendReplacement(sb, replacement2);
}
//sb中储存的只是匹配结束位置的信息,appendTail是加上最后未匹配到的部分⽂本内容,从⽽使内容完整 m.appendTail(sb);
//System.out.println("str是------------------------"+str);
//System.out.println("sb是------------------------"+sb);
//控制台测试
/*System.out.String());
m.appendTail(sb);
System.out.String());*/
try{
FileWriter fileWriter = new FileWriter(path);
fileWriter.String());
//System.out.println(sb);
fileWriter.close();
}catch (Exception e){
e.printStackTrace();
}
}
主函数
主函数调⽤查xml⽅法和替换⽂本内容
public static void main(String[] args)
{
File f = null;
File[] paths;
//需要替换的内容
String replacement = "from {$publicdb}.";
AddPrefixXml fileFilter = new AddPrefixXml();
try{
f = new File("D:\\E10\\base-common-web\\base-common-web-service\\src\\main\\java\\com\\weaver\\base\\common\\web\\dao");
// ⽂件⽂件名字过滤器
FilenameFilter fileNameFilter = fileFilter .new FileFilter(".xml") ;
paths = f.listFiles(fileNameFilter);
for(File path:paths){
/*
传递的参数
1.path⽂件路径,
2.patString:正则表达式(需要匹配的内容)
3.需要替换的内容
*/
replace(path,"from [a-z]",Matcher.quoteReplacement("from {$publicdb}."));
replace(path,"insert into [a-z]",Matcher.quoteReplacement("insert into {$publicdb}."));
replace(path," update [a-z]",Matcher.quoteReplacement("update {$publicdb}."));
replace(path,"left join [a-z]",Matcher.quoteReplacement("LEFT JOIN {$publicdb}."));
}
}catch(Exception e)
{
e.printStackTrace();
}
}
最后完整代码
本次是对所有xml⽂件的中,所有表名的前⾯加上⼀个前缀,如果需要修改其他内容当然只需要填⼊需要匹配的正则表达式,和需要写⼊的内容即可。
package com.weaver.basemon.web.util;
/**
* @Date:Created in 17:48 2022/2/14
* ⽤于表名前加前缀
*/
import java.io.*;
import Matcher;
import Pattern;
public class AddPrefixXml {
//匹配.xml后缀⽂件内部类
public class FileFilter implements FilenameFilter
{
private String filterRule;
public FileFilter(String filter)
{
this.filterRule = filter;
}
@Override
public boolean accept(File dir, String name) {
if(name.lastIndexOf('.')>0)
{
// get last index for '.' char
int lastIndex = name.lastIndexOf('.');
// get extension
// get extension
String str = name.substring(lastIndex);
// match path name extension
if(str.equals(this.filterRule))
{
return true;
}
}
return false;
}
}
/*
替换⽂件内容
传递的参数1.path⽂件路径,
2.patString:正则表达式(需要匹配的内容)
3.需要替换的内容
*/
java replace方法public static void replace(File path,String patString2,String replacement2) {
// 正则表达式
String patt = patString2;
// 测试的输⼊字符串
String str="";
File file=path;
try {
FileInputStream in=new FileInputStream(file);
// size 为字串的长度,这⾥⼀次性读完
int size=in.available();
byte[] buffer=new byte[size];
in.close();
str=new String(buffer,"UTF-8");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//System.out.println("读取到⽂件的信息为-----------------------------------:" + str);
// 从正则表达式实例中运⾏⽅法并查看其如何运⾏
Pattern r = Patternpile(patt,Pattern.CASE_INSENSITIVE);
Matcher m = r.matcher(str);
/
/System.out.println("替换成的⽂件为----------------------------------------------------:" + m.replaceAll("favour")); // appendReplacement⽅法
StringBuffer sb = new StringBuffer();
while (m.find()) {
// 将匹配之前的字符串复制到sb
m.appendReplacement(sb, replacement2);
}
//sb中储存的只是匹配结束位置的信息,appendTail是加上最后未匹配到的部分⽂本内容,从⽽使内容完整 m.appendTail(sb);
//System.out.println("str是------------------------"+str);
//System.out.println("sb是------------------------"+sb);
//控制台测试
/*System.out.String());
m.appendTail(sb);
System.out.String());*/
try{
FileWriter fileWriter = new FileWriter(path);
fileWriter.String());
//System.out.println(sb);
fileWriter.close();
}catch (Exception e){
e.printStackTrace();
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论