正则:替换一行中的最后一个逗号

现在有个需求,需要将:

Wang T., Zhang J., Li S.

这种格式转换为:

Wang T., Zhang J. & Li S.

即将最后一个逗号转换为&符号。

搜索了一下,最后发现可以使用这种正则进行替换:

,(?=[^,]+$)

 

参考:

  1. http://house-of-fusion.10909.n7.nabble.com/How-to-find-the-last-comma-and-the-word-following-it-w-regex-td113028.html

用正则处理srt电影字幕

下了个电影,本身带的字幕翻译质量很差。从网上找了个高质量的字幕,结果发现在mplayer里无法显示,用文本编辑器打开字幕显示也很正常,和之前的字幕对比好像也没有什么差异。最后发现是在时间戳下面多出了一个空行:

1
00:00:10,000 --> 00:00:20,020

 本字幕仅供学习交流试看使用 禁止用于商业行为
 并请于下载后24小时内删除 若因私自传播造成法
 律问题 本人概不负责。

2
00:00:30,897 --> 00:00:33,333

“中东 1997年”

3
00:01:15,708 --> 00:01:18,912

呼叫01阿尔法,我们已控制住猎鹰

只要把空行删除,mplayer就可以正常显示字幕,于是用正则表达式进行替换,在komodoedit里用替换,打开多行、正则:

(,\d{3})\r\n\s+

替换为:

\1\r\n

这样就可以愉快地观影了。

postgresql中的正则替换

在PostgreSQL中支持正则替换函数regexp_replace,可以处理replace函数无法完成的情况。比如,在GeoNetwork中若要统一替换一批数据的发布时间,其数据是存储为xml格式,发布时间不统一,可以采用这样的多级SQL查询来实现:

update metadata set data=regexp_replace(data,'<refDate>.*<\/refDate>','<refDate>2013-6-16</refDate>') where
id in (
select t.id
from
(select id,(regexp_matches(data,'<resTitle>(.*)</resTitle>'))[1] as title from metadata) as t
where t.title like '黑河生态水文遥感试验%'
)

说明:
1. regexp_replace替换字符串
2. regexp_matches限制处理范围

用gedit合并3行文本为一行

现在有一个生成的文本要转换为xls进行比对处理,需要将文本中的三行转换为一行:
9b39b822-b6ea-47aa-bf6f-ca3b46666e2d
364K .
14
efdcd3c4-57f6-4ca2-8ac6-f15a378b730b
4.0M .
29
f4ea6c49-2dfe-45c3-937e-7e4639461f6c
1.2G .
25

用ubuntu的gedit可以处理,需要regex插件:
1. 用gedit常规的替换操作将所有文本合并为一行。(即将\n替换为\t)
2. 用regex插件的替换功能:
\t\.\t([0-9]*)\t(.*?)-
替换为:
\t\1\n\2-
最终替换后效果为:
9b39b822-b6ea-47aa-bf6f-ca3b46666e2d 364K 14
efdcd3c4-57f6-4ca2-8ac6-f15a378b730b 4.0M 29
f4ea6c49-2dfe-45c3-937e-7e4639461f6c 1.2G 25

简易数据正则处理

因为数据服务填报系统中有个数据需要进行简易的处理,即移除数据列表中的文件大小,而此数据是csv格式的文件,首先想到的就是通过openoffice来进行快捷的处理。
1、OpenOffice尝试
OpenOffice中也有正则支持,默认是关闭的,在“查找与替换”中,点击“更多选项”,然后选择正则表达式,即可打开正则表达式支持。
实际上,我需要运行的正则很简单,即:

\(.*?MB\)

将此内容替换为空即可。
但不知道什么原因,在openoffice中运行此正则不成功,只能查找到部分结果。
2、gedit尝试
gedit也有正则支持的插件,即高级查找替换插件。安装之后运行效果也很好,非常直观。但最后发现对csv全局替换会有误伤,即前面括号中内容也给替换掉了。
3. sql尝试
最终就想在postgresql数据库里直接使用正则进行替换,发现postgresql中有一个regexp_replace函数,可以直接支持sql上进行正则,因此尝试用这个SQL来替换:

select regexp(datalist,'\(.+?MB\)','') from offlineapp

但这个每行只替换了一个第一个后就返回了,因此还需要添加一个flag:

select regexp(datalist,'\(.+?MB\)','',‘g') from offlineapp