正则的日常应用(基于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* 进行同时定位
- 或者换种思路直接匹配
-
.定位任意字符 -
+匹配前面字符 >=1 个 等价于{1,}
,zc_state, zc_state_17 的开头和结尾 ,zc.+17
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中,需要去除 而仅保留文本时
my $_ = "I'm talking about the cartoon with Fred and <BOLD>VelmaBOLD>,<BOLD>not WilmaBOLD>.";
1.当采用贪婪量词的时候
# 用该方法结果
s/<BOLD>(.*)<\BOLD>/$1/g;
# 结果: "I'm talking about the cartoon with Fred and VelmaBOLD>,<BOLD>not Wilma."
显然匹配过多的中间内容了
2.当采用非贪婪量词的时候
- 在贪婪量词后面加一个?。
# 用该方法结果
s/(.*?)<\BOLD>/$1/g;
# 结果: "I'm talking about the cartoon with Fred and Velma,not Wilma."
- 原理解释:
-
进行匹配(.*)<\BOLD>
第一步:找到开头字符(从左到右)
第二步:从开头字符开始 吞下所有字符Velma,not Wilma .
第三步:从右向左回溯,找到结尾的字符<\BOLD>
最终匹配到:Velma,not Wilma -
进行匹配(.*?)<\BOLD>
第一步:找到开头字符(从左到右)
第二步:从开头字符开始 逐一吞下字符,找到结尾字符<\BOLD>停止Velma因为例子中有/g进行全局匹配,因此,又匹配到Wilma
最终匹配到:Velma,not Wilma
因此,当匹配的字符串开头结尾在句子中时,采用非贪婪量词匹配效率更高
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
