如何在Perl中使用正则表达式
发表于:2024-11-29 作者:千家信息网编辑
千家信息网最后更新 2024年11月29日,这篇文章主要为大家展示了"如何在Perl中使用正则表达式",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"如何在Perl中使用正则表达式"这篇文章吧。如何在P
千家信息网最后更新 2024年11月29日如何在Perl中使用正则表达式如何在Perl 中使用正则表达式。 关于 Perl 正则匹配一个简单的例子如下所示: 在 if 的圆括号内默认匹配的是变量 $_ 的内容,因此这段程序实际上是下面所示: 除了在界定符前可以指定处理模式,在界定符之后还可以添加小写字母修饰符。这些修饰符也叫标志( flag ),用来改变默认的匹配行为,正如上一小节展示的使用 ASCII 编码的 //a 一样。常用的匹配模式下的修饰符有以下几种: 上面表格中不同的模式修饰符可以进行组合使用,而且其顺序对模式没有影响,如下所示: 从 Perl 5 开始,脱字符 ^ 和 $ 表示行首和行尾的锚位,这对行输入的数据非常有用,因为行输入的字符串有且只有一个换行符在末尾。对于具有多个换行符的字符串,也即多行文本数据变量,可以使用 //m 修饰符,使得脱字符 ^ 和 $ 可以同时锚定字符串开头、每一行开头、字符串结尾、每一行结尾,如下所示: 上面代码中如果不加 //m 修饰符则 ^ 只会匹配字符串开头从而匹配失败。此外还有另一种更严谨的锚位方法,使用 \A 、 \Z 、 \z 锚定字符串的开头、每一行末尾、字符串结尾。需要注意的是对于行输入的单行字符串来说 \Z 、 \z 也是完全不同的, \Z 会匹配换行符前的内容,而 \z 匹配字符串结尾(包括换行符)内容。其使用方法如下所示: 除了字符串、行的首尾,一个单词的首尾可以使用 \b 进行锚位,这里的单词指的是 \w 字符集也即 [a-zA-Z0-9_] 组成的字符串, \b 根据出现的非 \w 字符(包括字符串的绝对首尾位置)判断单词的边界,如下所示: 与双引号内部的变量内插一样,正则表达式内部也可以使用各种数据变量,从而更好的融合到 Perl 程序之内。正则表达式一般将变量放在括号内(这是和反向引用类似的),例如下面一段类似于 grep 工具命令的小程序: 上面程序中通过键盘输入 $what 的值,正则表达式会根据 $what 的值对命令行参数指定的文件的每一行开头进行匹配,匹配成功则输出该行内容。 $what 可以是任何值,甚至是正则表达式元字符,如下所示: 在上一小节正则表达式的模式分组中,我们知道圆括号通常会触发正则表达式捕获相匹配的字符串以供反向引用。事实上, Perl 会自动将这些圆括号内的捕获组储存在称为捕获变量的标量变量里面,其变量名与反向引用的编号一样都是数字,其命名与捕获组编号相同,也即 $1 、 $2… 。模式当中有多少圆括号,就有多少捕获变量,这些变量在正则表达式匹配完成之后仍可以使用,捕获变量是 Perl 正则表达式强大的原因之一。一个简单的示例如下所示: 运行结果如下所示: 尽管我们有多种办法避免在程序维护的时候使捕获组编号错乱,例如使用只具有模式分组功能的圆括号,但是使用顺序编号的捕获变量名称仍会带来很多麻烦。从 Perl 5.10 开始,允许用户为捕获变量自定义命名,称为标签( label ),其写法为在相应捕获组括号里最开头添加问好 ? 和 label ,也即 (? 其运行效果与前面相同。同理,在正则表达式里的反向引用可以使用 \g{label} 或者 \k{label} 。此外, Perl 还有三个自动捕获变量,其中 $& 内储存的是正则表达式匹配的全部内容, $` 内储存的是匹配区段之前的内容, $' 内储存的是匹配区段之后的内容。这三个捕获变量可以随意使用,但代价是会使程序运行变慢。在 Perl 5.10 及以上的版本,这三个变量有另一种更形象的写法 ${^PREMATCH} 、 ${^MATCH} 、 ${^POSTMATCH} 。
这篇文章主要为大家展示了"如何在Perl中使用正则表达式",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"如何在Perl中使用正则表达式"这篇文章吧。
⑴匹配模式
我们已知在Perl中正则表达式被称为模式,这种模式(也即正则表达式)可以放在由成对符号(例如()、<>、{}等)或者一对不成对的符号(例如//、!!、^^等)组成的界定符内,并在界定符前用小写字母指定模式的种类。当然我们不希望界定符和正则表达式的符号有所冲突(如果实在有冲突可以使用反斜杠转义),事实上最常用的界定符为双斜杠//。在Perl中有很多处理模式,其中最简单的为匹配模式m//,或者也可以理解为查找模式。由于正则表达式本身就有匹配的含义,以双斜杠作为定界符时m可以省略。其他处理模式详见下一小节。
$_ = "yabba dabba doo";if (/y(.)(.)\2\1/) { print "It matched!\n";}
运行结果如下所示:
$_ = "yabba dabba doo";if ($_ =~ /y(.)(.)\2\1/) { print "It matched!\n";}
其中=~是表示内容匹配的绑定操作符,其返回值为表示是否成功匹配的布尔值,基于上面的写法我们可以根据实际需要随意改变要匹配的变量名称。
⑵模式修饰符
/abc.*xyz/is #忽略大小写并使点号匹配任意字符
⑶锚位
$_ = "This is the wilma linebarney is on another linebut this ends in fred";if (/^barney/m) { print "It matched!\n";}
/\Abarney/ #匹配字符串绝对开头位置的barney/fred\z/ #匹配字符串绝对末尾位置的fred/fred\Z/ #匹配行尾也即换行符前的fred/\A\s*\Z/ #匹配一个空行
/\bfred\b/ #会匹配fred、fred's但是不会匹配afred、fred_s
此外\B则会锚定非单词边界,如下所示
/\bfred\B/ #会匹配fred_s 但是不会匹配fred、fred's、afred
⑷变量内插
my $what =;chomp $what;while (<>) { if (/\A($what)/) { print "$_"; }}
⑸捕获变量
$_ = "Hello there, neighbor";if (/(\S+).*,\s(\w+)/) { print "What I said is:\n$1 $2!\n";}
这些捕获变量在下一次正则表达式成功匹配之前都是有效的,如果某次匹配失败,那么捕获变量里储存的仍是上一次成功匹配时的数据,这里的匹配成功指的是整个模式的匹配而非捕获组的匹配,这也是模式匹配以及捕获变量的使用一般在if和while等布尔值控制结构里面的原因。如果想永远使用某次捕获的内容,则可以使用捕获变量为自定义标量变量赋值。
$_ = "Hello there, neighbor";if (/(?\S+).*,\s(? \w+)/) { print "What I said is:\n$+{name1} $+{name2}!\n";}
以上是"如何在Perl中使用正则表达式"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
变量
正则
表达式
字符
模式
字符串
内容
开头
程序
成功
圆括号
换行符
一行
单词
数据
锚位
输入
运行
三个
位置
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
2021网络安全新规
浪潮数据库软件内容
朝阳赛区网络安全
遗传病文献数据库
比热容课件软件开发
短视频剧本网络安全
电竞和网络安全大赛
网络安全与媒体责任公益
无法输入网络安全密匙
截取字符前数据库
洛奇连接服务器失败
sql数据库错误15150
海口龙芯服务器批发
泰拉瑞亚服务器获取管理权限
怎么找出满足条件的数据库
rtk软件开发
国家电网网络安全口号
心理学的数据库
我的世界服主怎么管理服务器
程序查数据库表
软件开发行业的物料是什么
e华为网络安全日
浪潮服务器机箱侧盖怎么拆
数据库int类型
云上企业数据库
河北语音网络技术质量服务
新基建idc金属服务器
远程服务器ie无法访问
rpc服务器不可用 开机
长宁区节能软件开发设计标准