加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl系列:正则表达式

发布时间:2020-12-15 21:00:49 所属栏目:大数据 来源:网络整理
导读:正则表达式即字符串模式 查看指定字符串中是否有想查找的模式:m/模式/ ????if ("abc" =~ m/a/) {print "tn";} else {print "fn";}??? #查看"abc"中是否包含"a" ??? #注意使用的符号是"=~",而不是"=" ????chomp ($_ = ); if (/a/) {print "tn";} else {p

正则表达式即字符串模式

查看指定字符串中是否有想查找的模式:m/模式/
????if ("abc" =~ m/a/) {print "tn";} else {print "fn";}??? #查看"abc"中是否包含"a"
??? #注意使用的符号是"=~",而不是"="
????chomp ($_ = <>); if (/a/) {print "tn";} else {print "fn";}??? #查看输入字符串是否包含a
??? #上面这个例子使用了两个默认情况
??? #一:在不指定字符串时,模式默认匹配$_
??? #二:模式的边界符使用"/"时,可以省略前面的m。同时意味着在使用m的时候,可以选用任意的标点符号,就像qw一样。

替换字符串中符合模式要求的部分:s/模式/字符串/
????$a="abc"; $a =~ s/a/d/; print "$an";??? #将$a中的a替换为d
????$_ = <>; s/a/d/; print;??? #将输入字符串中的a替换为d
??? #注意:不能省略s,但边界符可以替换
??? #s/模式/字符串/:前面的部分是模式,后面的部分相当于双引号字符串???

分割和连接字符串
1、@a=split /模式/,$a;??? #将模式指定的部分作为分隔符,将$a中的字符串切割并存入@a
??? 匹配部分作为分隔符,不返回。
??? 若两个分隔符相邻,则产生空字段。split会返回开头的空字段,但会舍弃结尾的空字段。
??? @a=split;??? #即@a=split /s+/,$_; split默认使用空白拆分字符串
??? @a=split //,$a;??? #将$a中的字符串逐个拆分
2、$a=join $b,@a ;??? #$b作为连接符,将@a中的各元素连成一个字符串
??? @a中的元素少于两个,不会连接。

模式的书写规则
1、量词:表示量词前的东西可以连续出现的次数
??? *??? #连续出现任意次,包括0次
??? +??? #连续出现一次以上
??? ???? #没有或出现一次
??? {5}??? #连续出现5次
??? {5,10}??? #连续出现最少5次,最多10次。注意逗号两边不能有空格。
??? {5,}??? #至少连续出现5次
??? {,5}??? #最多连续出现5次
??? 贪心与非贪心:默认情况下模式会在量词允许范围内,进行最多匹配,当在量词后使用"?"时,会进行最少匹配。
??? {5,10}???? #当模式可以匹配6次时,只匹配前5次
2、精确匹配
??? /abc/??? #只能匹配"abc"
3、通配符
??? .??? #可以匹配换行符以外的所有单个字符
??? .*??? #可以匹配任意数目的任意字符
4、模式组:()内的东西当作一个整体
??? /ab(china)+d/??? #ab和d之间至少有一个china
5、择一匹配:"|"
??? /a|c/??? #匹配a或c中的任一个
??? #n个"|"可对n+1个模式进行选择
6、字符集:[],一个字符集只匹配一个字符
??? /[abcd]/??? #匹配abcd中的任何一个即可
??? /[2-8]/??? #可以使用"-"指定范围
??? /[^abcd]/??? #排除字符集,使用^表示匹配括号内所列字符以外的所有东西
??? /d/??? #即/[0-9]/
??? /w/??? #即/[A-Za-z0-9_],包括字母、数字、下划线
??? /s/??? #代表/ftnr]/,包括常见不显示的字符,即空白
??? /D/、/W/、/S/??? #??? 分别表示/d/、/w/、/s/的反义
7、锚点:用于限定匹配的位置
??? ^??? #字符串开头
??? $??? #字符串末尾
??? b??? #"w+"的开头或结尾
??? B??? #非"b"的位置
8、模式修饰符:放在右侧边界符的外边,多个修饰符可联用
??? s??? #使"."可以匹配换行符
??? i??? #进行不区分大小写的匹配
??? x??? #使模式里可以随意添加空白
??????????? #由于注释也属于一种空白,因此复杂模式可分行书写并加注释说明
??????????? #若需匹配空白,可使用s
??? g??? #默认匹配只发生一次,但使用g可进行多次匹配。注意下次匹配是从前次匹配结束的位置开始。
??? m??? #在多行文本中,使锚点"^"和"$"分别表示行首和行尾
????替换也可以使用修饰符,如:s/模式/字符串/sig
9、模式内变量替换
??? /$a/??? #使用$a的值作为模式
??? /ab($a)cd/??? #建议使用()将变量围住
10、优先级
??? ①();②量词;③除"|"以外的其他字符;④"|"

模式内()的记忆作用
1、()在模式内表示模式组的同时,也记忆了实际匹配到的字符串(注意不是模式)。
??? 第1对()将其记忆储存在$1中,第n对()将其记忆储存在$n中。该记忆一直维持到下次匹配成功之前。
??? 这n个()应该在一个模式里,若两个模式都使用了(),则后面模式的$1不会储存前一个模式的记忆。
2、由于()在模式内有记忆效应,因此使用()表示优先级时,需注意对默认变量编号的影响。
??? 若不需要()的记忆作用,可在"("右侧加上"?:"。例:
??????? /(?:w+)s+(w+)/??? #$1储存第二个括号的匹配内容
3、也可以将()的记忆内容直接赋值于其他变量
??? $a=/(w+)/;
??? @a=/(w+)/g;
??? %a=/(w+)s+(w+)/g;

默认匹配记忆变量
??? 无论模式内是否有(),该模式所匹配到字符串都存储于$&。
??? 该字符串之前的部分储存于$`,之后的部分储存于$'。
????"abc" =~ /b/; print "$`n$&n$'n";??? #第一行a,第二行b,第三行c

m//的返回值 在标量环境下只返回是否匹配成功 在列表环境下,若不使用修饰符g,也仅返回是否匹配成功; ??? 使用修饰符g之后,则返回所有匹配结果

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读