编辑器: 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中,需要去除<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
因此,当匹配的字符串开头结尾在句子中时,采用非贪婪量词匹配效率更高