最小匹配的实例
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'),