perl踩坑系列===正则表达式第2坑---split中的“或”操作符

简单match的情况

先看能否匹配的问题

perl 复制代码
$perl -e 'my $a="2892delinsCGCT"; if($a=~/del|ins|delins/){print "match\n"};'
match

加上括号也没问题

perl 复制代码
$perl -e 'my $a="2892delinsCGCT"; if($a=~/(del|ins|delins)/){print "match\n"};'
match

换几种方式加括号也没问题

perl 复制代码
$perl -e 'my $a="2892delinsCGCT"; if($a=~/(del)|(ins)|(delins)/){print "match\n"};'
match

换一下顺序,似乎也不影响:

perl 复制代码
$perl -e 'my $a="2892delinsCGCT"; if($a=~/(ins)|(del)|(delins)/){print "match\n"};'
match
perl 复制代码
$perl -e 'my $a="2892delinsCGCT"; if($a=~/(delins)|(ins)|(del)/){print "match\n"};'
match
perl 复制代码
$perl -e 'my $a="2892delinsCGCT"; if($a=~/delins|ins|del/){print "match\n"};'
match
perl 复制代码
$perl -e 'my $a="2892delinsCGCT"; if($a=~/(delins|ins|del)/){print "match\n"};'
match

随便怎么变,perl竭诚为您服务。。。。。。。。。。。。

同样的匹配方式,用作split会怎么样?

下面是见证奇迹的时刻:

perl 复制代码
$perl -e 'my $a="2892delinsCGCT"; my @a = (split /del|ins|delins/, $a); my $b = join "=", @a; print "$b\n"; my $c=scalar(@a); print "$c elements\n";'
2892==CGCT
3 elements

第1个元素是"2892"

第3个元素是"CGCT"

第 2个元素是...空值

惊喜?意外? 百撕不得骑姐..............

如果加个括号:

perl 复制代码
$perl -e 'my $a="2892delinsCGCT"; my @a = (split /(del|ins|delins)/, $a); my $b = join "=", @a; print "$b\n"; my $c=scalar(@a); print "$c elements\n";'
2892=del==ins=CGCT
5 elements

孔子不懂,孟子不懂,老子也.....

如果把括号再玩得花一点:

perl 复制代码
$perl -e 'my $a="2892delinsCGCT"; my @a = (split /(del)|(ins)|(delins)/, $a); my $b = join "=", @a; print "$b\n"; my $c=scalar(@a); print "$c elements\n";'
2892=del=====ins==CGCT
9 elements

除了第一个"2892"和最后一个"CGCT"算正常意外,中间的都不知道是从什么石头缝里蹦出来的。

如果把最长的分隔符"delins"放在最前面

perl 复制代码
$perl -e 'my $a="2892delinsCGCT"; my @a = (split /delins|del|ins/, $a); my $b = join "=", @a; print "$b\n"; my $c=scalar(@a); print "$c elements\n";'
2892=CGCT
2 elements

这是符合预期的。

把字符串改得更妖娆一点,仍然没问题

perl 复制代码
$perl -e 'my $a="2892delinsCGCTdelAGCTinsGGGG"; my @a = (split /delins|del|ins/, $a); my $b = join "=", @a; print "$b\n"; my $c=scalar(@a); print "$c elements\n";'
2892=CGCT=AGCT=GGGG
4 elements

只是换个顺序,结果有所改变

perl 复制代码
$perl -e 'my $a="2892delinsCGCTdelAGCTinsGGGG"; my @a = (split /del|ins|delins/, $a); my $b = join "=", @a; print "$b\n"; my $c=scalar(@a); print "$c elements\n";'
2892==CGCT=AGCT=GGGG
5 elements

但这仍然比较好理解,因为"delins"在前就优先用"delins"分割,"del"在前就优先用"del"分割。

但若再加个括号,画风立马改变

perl 复制代码
$perl -e 'my $a="2892delinsCGCT"; my @a = (split /(delins|del|ins)/, $a); my $b = join "=", @a; print "$b\n"; my $c=scalar(@a); print "$c elements\n";'
2892=delins=CGCT
3 elements

分割成了3个元素,而第二个元素,不知道为什么成了"delins"。

括号的花样不同,split作妖的结果也不同

perl 复制代码
$perl -e 'my $a="2892delinsCGCT"; my @a = (split /(delins)|(del)|(ins)/, $a); my $b = join "=", @a; print "$b\n"; my $c=scalar(@a); print "$c elements\n";'
2892=delins===CGCT
5 elements

或许有一天我会有心情来理顺这里面的逻辑,但是现在,与其往死磕,不如绕过去。。。

所以省力的方式是:

不要在split里面使用"|"操作符,而应该将确定的分隔符喂给split

perl 复制代码
$perl -e 'my $a="2892delinsCGCT"; if($a=~/(delins)|(del)|(ins)/){my @a = (split /$1/, $a); my $b = join "=", @a; print "$b\n"; my $c=scalar(@a); print "$c elements\n";}'
2892=CGCT
2 elements

当然,还要注意,不要随便使用1...n之类的东西,因为那是perl为您定制的另外一个坑

要将1...n第一时间赋值给其他变量:

perl 复制代码
$perl -e 'my $a="2892delinsCGCT"; if($a=~/(delins|del|ins)/){my $separator = $1; my @a = (split /$separator/, $a); my $b = join "=", @a; print "$b\n"; my $c=scalar(@a); print "$c elements\n";}'
2892=CGCT
2 elements

另外就是还要注意优先顺序,比如:

perl 复制代码
if($a=~/(delins|del|ins)/){}

是优先按"delins"匹配,其次"del",再次 "ins"

"del"和 "ins"不会存在选择优先顺序的,因为这俩字符差异很大

但"delins" 和"del", 或者"delins" 和"ins", 都会存在谁优先的问题。

放在前面的,就优先用于匹配

相关推荐
3GPP仿真实验室16 分钟前
【Matlab源码】6G候选波形:OFDM-IM 增强仿真平台 DM、CI
开发语言·matlab·ci/cd
devmoon20 分钟前
在 Polkadot 上部署独立区块链Paseo 测试网实战部署指南
开发语言·安全·区块链·polkadot·erc-20·测试网·独立链
lili-felicity20 分钟前
CANN流水线并行推理与资源调度优化
开发语言·人工智能
沐知全栈开发21 分钟前
CSS3 边框:全面解析与实战技巧
开发语言
island131431 分钟前
CANN GE(图引擎)深度解析:计算图优化管线、内存静态规划与异构 Stream 调度机制
c语言·开发语言·神经网络
曹牧35 分钟前
Spring Boot:如何在Java Controller中处理POST请求?
java·开发语言
浅念-38 分钟前
C++入门(2)
开发语言·c++·经验分享·笔记·学习
WeiXiao_Hyy39 分钟前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端
User_芊芊君子1 小时前
CANN010:PyASC Python编程接口—简化AI算子开发的Python框架
开发语言·人工智能·python
Max_uuc1 小时前
【C++ 硬核】打破嵌入式 STL 禁忌:利用 std::pmr 在“栈”上运行 std::vector
开发语言·jvm·c++