正则表达式

最小匹配的实例

1、需求说明

需求是这样的,我们要基于一个文件名称,比如 “作业_20201020.zip” 给它加一个后缀来标明成全局唯一的文件,比如 “作业_20201020_1691998649_dd70c99c-338a-4f72-96b6-d4068dea00f0.zip”, 也就是加了一个时间戳和一个uuid作为后缀。现在我们需要用正则把这样的文件还原成原来的名字。也就是说我们希望把【作业_20201020_1691998649_dd70c99c-338a-4f72-96b6-d4068dea00f0.zip】变为【作业_20201020.zip】。

有注意事项:

1、如果文件本身不带特殊后缀,还原回去还是文件本身。

2、如果文件名称本身就是【作业_20201020_1691998649_dd70c99c-338a-4f72-96b6-d4068dea00f0.zip】,经过处理就会变为【作业_20201020_1691998649_dd70c99c-338a-4f72-96b6-d4068dea00f0_1691998649_dd70c99c-338a-4f72-96b6-d4068dea00f0.zip】,我们还原的时候也就是要把最后的一组后缀去掉。

测试数据:

输入输出
作业.zip作业.zip
作业_20201020_1691998649_dd70c99c-338a-4f72-96b6-d4068dea00f0.zip  作业.zip                                                                                
作业_20201020_1691998649_dd70c99c-338a-4f72-96b6-d4068dea00f0_1691998649_dd70c99c-338a-4f72-96b6-d4068dea00f0.zip作业_20201020_1691998649_dd70c99c-338a-4f72-96b6-d4068dea00f0.zip

2、用vscode匹配

用vscode编辑器,创建一个空文件,输入内容,在按【ctrl + h】, 出来的选择框就是替换功能,可以支持正则,并进行替换匹配。

第一版:

查找:  ^(.*)(_\d+_[-0-9a-zA-Z]+)(\.\w+)$

替换:  $1$3

文件本身名称用 .* 匹配。

因为uuid是数字、字母、下划线组成的,我用[-0-9a-zA-Z]+来匹配。整个后缀就是 _\d+_[-0-9a-zA-Z]+来匹配。

文件的扩展名,用 \,\w+匹配。

上面分了三个子组, 最后用 $1$3来拼接出新的字符串,也就是把第二组拿到的后缀剔除了。

第二版:

上面正则要求必须有一个后缀,但我们还得匹配【作业.zip】这个情况,所以后缀是可有可无的。

^(.*)(_\d+_[-0-9a-zA-Z]+)?(\.\w+)$

这个正则用 ? 表示后缀的数量可以是 0或1,也就是如果后缀没有也是可以的。

但是有个问题,因为 (/*)是贪婪匹配,几乎匹配所有字符串,那么后面的(_\d+_[-0-9a-zA-Z]+)?就没机会匹配到数据。

比如对于【作业_20201020_1691998649_dd70c99c-338a-4f72-96b6-d4068dea00f0.zip】,

我们拿到的

$1 是【作业_20201020_1691998649_dd70c99c-338a-4f72-96b6-d4068dea00f0】

$2 是 【】, 即空的

$3 是 【.zip】

第三版

对于(.*)这个子表达式,我们改为(.*?),也就是非贪婪匹配(最小匹配),这样如果有后缀,后面的子表达式也能匹配到后缀。 

^(.*?)(_\d+_[-0-9a-zA-Z]+)?(\.\w+)$

一个拼接sql的例子

1、需求说明

把下面文本拼接成一个sql

明十三陵景区 北京市 北京市 北京市昌平区十三陵镇龙母庄明十三陵景区 116.2342026 40.28217425 风景名胜

insert into app_mark(mark_type, status, user_id, scenery, province, city, address, longitude, latitude)
VALUES(1, 3, '3277321185217011712', '丰润区众思采摘园', '河北省', '唐山市', '河北省唐山市丰润区银城铺镇丰润区众思采摘园', 118.1873583,39.79939567);

也就是要拼出如下内容

(1, 3, 'xxxxxxxxxxxxxxxxx', '丰润区众思采摘园', '河北省', '唐山市', '河北省唐山市丰润区银城铺镇丰润区众思采摘园', 118.1873583,39.79939567),

2、用vscode匹配

用vscode编辑器,创建一个空文件,输入内容,在按【ctrl + h】, 出来的选择框就是替换功能,可以支持正则,并进行替换匹配。

查找
(.*?)(\s+)(.*?)(\s+)(.*?)(\s+)(.*?)(\s+)(.*?)(\s+)(.*?)(\s+)(.*)
替换
(1, 3, 'xxxxxxxxxxxxxxxxx', '$1', '$3', '$5', '$7', $9, $11,'$13'),

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值