原始文本:
2011年7月18日:修改密码的核心功能开发完毕; 2011年7月19日:上午换座位,下午提交了著作权文档的电子流程;
目标格式文本:
2011-7-18:修改密码的核心功能开发完毕; 2011-7-19:上午换座位,下午提交了著作权文档的电子流程;
vim实现
:%s/\(\d\{4}\).\(\d\{1,2}\).\(\d\{1,2}\)./\1-\2-\3/g
说明: 采用 :%s/old/new/g 命令进行替换,其中%表示对所有行进行替换操作,最后的g参数表明对一行中所有的new均替换为old。\d代表任意数字,old pattern中每个括号(即(...))中的内容构成一个group member,new pattern中对group member的引用用\1、\2、\3...代表,即"BRE", back references.
Groovy实现
oriStr = '''2011年7月18日:修改密码的核心功能开发完毕;
2011年7月19日:上午换座位,下午提交了著作权文档的电子流程;''';
pattern = /(\d{4})\W(\d{1,2})\W(\d{1,2})\W/;
matcher = oriStr =~ pattern;
matcher.each { all,y,m,d->
println 'Patten is: '+all;
println 'Replaced by: '+y+'-'+m+'-'+d;
};
println '*****';
println oriStr.replaceAll (pattern) {all,y,m,d->y+'-'+m+'-'+d;};
运行结果:
Patten is: 2011年7月18日
Replaced by: 2011-7-18
Patten is: 2011年7月19日
Replaced by: 2011-7-19
*****
2011-7-18:修改密码的核心功能开发完毕;
2011-7-19:上午换座位,下午提交了著作权文档的电子流程;
说明: 跨行字符串用三引号括起来;匹配模式用“ /.../” 括起来;用模式匹配字符串时,每一次成功匹配构成了matcher的一个元素(代码中用matcher.each得到),如果模式当中包含group(可以matcher.hasGroup()判断),则这个元素本身也是一个List,其中第一个元素是符合模式的substring(代码中的all),各个group member可以用下标引用,也可以分别起名字(代码中分别为y、m、d)。这部分内容可参见《Groovy in Action》(2007版)第3.5节“Working with regular expressions”。Groovy的String.replaceAll方法包括两个参数,第一个是要被代替的pattern,第二个是用来代替pattern的closure,该closure的返回结果是最后一行代码的值。
例如:println oriStr.replaceAll (pattern) {all,y,m,d->y+'-'+m+'-'+d;return 'Date'};
的输出是:
Date:修改密码的核心功能开发完毕;
Date:上午换座位,下午提交了著作权文档的电子流程;
基于文件读写的Groovy实现
pattern = /(\d{4})\W(\d{1,2})\W(\d{1,2})\W/;
convStr = '';
new File('f:/Edit3.txt').eachLine{
convStr += (it.replaceAll (pattern) {all,y,m,d->y+'-'+m+'-'+d})+'\n'
}
new File('f:/conv.txt').write convStr;
说明: 第4行的it表示此行文本(字符串)。