DarkMatter in Cyberspace
  • Home
  • Categories
  • Tags
  • Archives

日期格式转换的正则表达式实现


原始文本:

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表示此行文本(字符串)。



Published

Jul 19, 2011

Last Updated

Jul 19, 2011

Category

Tech

Tags

  • back references 1
  • 格式 4
  • groovy 13
  • 日期 5
  • Vim 92
  • 正则表达式 4
  • 转换 11

Contact

  • Powered by Pelican. Theme: Elegant by Talha Mansoor