原始文本:
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...代表。
- 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的String.replaceAll方法包括两个参数,第一个是要被代替的pattern,第二个是用来代替pattern的closure,该closure的返回结果是最后一行代码的值。
例如:println oriStr.replaceAll (pattern) {all,y,m,d->y+'-'+m+'-'+d;return 'Date'};的输出是:
Date:功能开发完毕;
Date:电子流程;