正则的日常应用(基于perl,可用于编写SQL时)

编辑器: VSCode

一、在写SQL中常常用到的替换正则

1、定位句首与句尾

虽然建临表批量处理很快,但是有时候也需要跑出中间表核查数据,所以当中间表较多的时候,能批量插入语句就相当便捷了。
^ 定位句首
$ 定位句尾

例:
定位句首
定位句尾

这样就可以十分便捷的对多表进行插入语句。

2、定位单词末尾

当需要对脚本进行固化,用perl进行批量处理的时候,就需要将地市,月份等在表中会变化的量赋值。但是,仅仅对几个字符定位的时候,会定位在句中的字符,这时候就需要定位到字符末尾的正则。
\b 定位字符末尾

例:
简单匹配替换肯定会出现问题:
这里写图片描述
当加入正则表达定位的时候,情况就不一样了:
这里写图片描述

3、较精准定位

当一个分析不需要一些字段的时候需要删除,如果可以快速匹配就能一次性去掉这些字段,增加效率了。
\d 定位数字0-9
\s 匹配空格
? 前面的字符可有可无:如:/ban-?ana/ 匹配 banana 和 ban-ana
* 前面的字符 >= 0 个(即可无)等价于 {0,}

例如,当我们的分析不需要 zc_state 和 zc_state_17 时,想快速去掉 用 ,\s?zc_state_?\d* 进行同时定位
这里写图片描述

或者换种思路直接匹配 ,zc_state, zc_state_17 的开头和结尾 ,zc.+17
. 定位任意字符
+ 匹配前面字符 >=1 个 等价于 {1,}

这里写图片描述
这里写图片描述

4、定位中文

有时候需要删除中文仅仅复制字段的时候,快速 定位中文并删除就很重要了
[\u4e00-\u9fa5] 定位中文

例如:用 / \s*[\u4e00-\u9fa5]+ / 快速定位多个中文和空格,替换为无,之后仅仅保留了英文字段。
这里写图片描述

二、 用正则处理文本(perl)

1、用s/// 进行替换

#!/user/bin/perl -w
my $_ = "He's out bowling with Barney tonight.";
s/Barney/Fred/; # 把Barney替换成Fred
print "$_\n";   # He's out bowling with Fred tonight.

# $1 代表第一个括号`(\w+)`里的正则所匹配到的字符
s/with (\w+)/against $1's team/;
print "$_\n";   
# He's out bowling with against Fred 's team tonight.

2、用/g 进行全局替换

# 一个相当常见的全局替换是缩减空白,也就是将任何连续的空白转换成单一空格
$_ = "Input  data\t may have    extra whitespace";
s/\s+/ /g;
print "$_\n";  #"Input data may have extra whitespace"
2.2 去除开头结尾的空白符
s/^\s+|\s+$//g;| 来连接,表示or

3、用/r 无损替换

同时保留原始字符串和替换后的字符串

方法一:

my $original = 'Fred ate 1 rib';
my $copy = $original;
$copy =~ s/\d_ ribs?/10 ribs/;  #  =~  绑定操作符

方法二:

my $copy = $original =~ s/\d_ ribs?/10 ribs/r;  #  =~  绑定操作符  /r 同时保留原始字符串和替换后的字符串
# 此时  $original 为 'Fred ate 1 rib' ,$copy 为 'Fred ate 10 ribs' 

4、非贪婪量词

在HTML中,需要去除<BOLD> 和 <\BOLD> 而仅保留文本时

my $_ = "I'm talking about the cartoon with Fred and <BOLD>Velma</BOLD>,<BOLD>not Wilma</BOLD>.";

1.当采用贪婪量词的时候

# 用该方法结果
s/<BOLD>(.*)<\BOLD>/$1/g;
# 结果: "I'm talking about the cartoon with Fred and Velma</BOLD>,<BOLD>not Wilma."

显然匹配过多的中间内容了

2.当采用非贪婪量词的时候
- 在贪婪量词后面加一个?

# 用该方法结果
s/<BOLD>(.*?)<\BOLD>/$1/g;
# 结果: "I'm talking about the cartoon with Fred and Velma,not Wilma."
原理解释:

<BOLD>(.*)<\BOLD> 进行匹配
第一步:找到开头字符<BOLD>(从左到右)
第二步:从开头字符开始 吞下所有字符Velma</BOLD>,<BOLD>not Wilma</BOLD>.
第三步:从右向左回溯,找到结尾的字符<\BOLD>
最终匹配到Velma</BOLD>,<BOLD>not Wilma

<BOLD>(.*?)<\BOLD> 进行匹配
第一步:找到开头字符<BOLD>(从左到右)
第二步:从开头字符开始 逐一吞下字符,找到结尾字符<\BOLD>停止Velma</BOLD> 因为例子中有/g 进行全局匹配,因此,又匹配到Wilma</BOLD>
最终匹配到Velma,not Wilma

因此,当匹配的字符串开头结尾在句子中时,采用非贪婪量词匹配效率更高

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Scc_hy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值