Perl 最佳实践(节选) --- 12
第十二章:正则表达式
正则表达式就是子程序。就是文本匹配子程序。
壹肆伍.
一定要用/x标记。
壹肆陆.
一定要用/m标记。
壹肆柒.
以\A和\z作为字符串边界锚点(anchor)。
#删除前后空白……
$text=~ s{\A \s* | \s* \z}{}gxm;
壹肆捌.
使用\z表示“字符串末尾”,不要用\Z。
Perl提供\z标示符号的变形版本:\Z。但是,小写\z是指“匹配字符串末尾”,而大写\Z是指“匹配可有可无的换行字符,然后是字符串末尾”。
壹肆玖.
总是使用/s标记。
壹伍零.
考虑强制使用Regexp::Autoflags模块。
为了我们在每个正则后面少输入“/xms”,我们可以使用:
useRegexp::Autoflags;
壹伍壹.
优先使用m{…},少在多行正则表达式中用/…/。
壹伍贰.
除了/…/或m{…}以外,不要用其他定界符。
壹伍叁.
最好使用字符类,不用转义的元字符(metacharacter)。
壹伍肆.
最好使用具名字符,不用转义的元字符。
例如:
if($escape_seq =~ /\177 \006 \030 Z/xms) { #Octal DEL-ACK-CAN-Z
blink(182);
}
改写为:
usecharnames qw( :full);
if($escape_seq =~ m/\N{DELETE} \N{ACKNOWLEDGE} \N{CANCEL} Z/xms) {
blink(182);
}
壹伍伍.
最好使用特性(property),而不用枚举式字符类。
Readonly my $ALPHA_IDENT => qr/ \p{Uppercase}\p{Alphabetic}* /xms;
注Perl5.8以上版本才支持Unicode。
壹伍陆.
考虑匹配任意空白,而不是特定空白字符。
$config_line=~ m{ ($IDENT) \s* = \s* (.*) }xms
壹伍柒.
当匹配“尽可能多”时,一定要制定。
#格式为:<source>% <data> & <config> ……
if($source =~ m/\A ([^%]*) % ([^&]*) & (.*) /xms) {
my($statements, $data, $config) = ($1, $2, $3);
my$prog = compile($statements, {config=>$config});
my$res = execute($prog, {data=>$data,config=>$config});
}
else{
croak ‘Invalid program’;
}
正则的最后“.*?”不是多余的,就是未做你想要做的事,或者是你忘了一个\z锚点。
壹伍捌.
只有当你要捕获时,才使用捕获小括号。
壹伍玖.
只有当你确定前次匹配成功时,才使用数值式的捕获变量。
数值式的捕获变量:$1,$2,$3…
壹陆零.
一定要给予捕获的子字符串适当的名称。
$myName = $1;
壹陆壹.
使用/gc标记把输入字符串记号化(tokenize)。
/gc标记告诉正则记录每次成功匹配都在何处完成匹配;
壹陆贰.
利用表格建立正则表达式。
# 建立模式以匹配任何下列不规则复数……
my$has_irregular_plural
=join ‘|’, map {quotemeta $_} reverse sort keys %irregular_plural_of;
壹陆叁.
由较简单的零件建立复杂的正则表达式。
# 建立正则表达式以匹配浮点数……
Readonlymy $DIGITS => qr{ \d+ (?: [.]\d*)? | [.]\d+ }xms;
Readonlymy $SIGN => qr{ [+-] }xms;
Readonlymy $EXPONENT => qr{ [Ee] $SIGN? \d+ }xms;
Readonly my $NUMBER =>qr{ ( ($SIGN?)($DIGITS) ($EXPONENT)}xms;
#稍后……
my($number, $sign, $digits, $exponent)
=$input =~ $NUMBER;
壹陆肆.
考虑使用Regexp::Common,不要自己写正则表达式。
壹陆伍.
使用字符类,不要使用单一字符交替(alternation)。
if ($quotelike!~ m{\A (?: q[qrx]| [gsy] |tr ) \z}xms) {
carp “Unknown quotelike: $quotelike”;
nextQUOTELIKE;
}
壹陆陆.
从交替选择中把共同的词缀分离出来。
壹陆柒.
避免无用的回溯。
壹陆捌.
最好用固定字符串的eq比较,不要用固定模式的正则表达式匹配。
# 离开命令有很多变形版本 ……
lastCOMMAND if $cmd =~ m{\A (?: q| quit |bye)}xms;
# 离开命令有很多变形版本 ……
lastCOMMAND if $cmd eq ‘q’
|| $cmd eq‘quit’
|| $cmd eq ‘bye’;
Perl 最佳实践(节选) --- 12相关推荐
- 生产中的12种容器镜像扫描最佳实践
现在很多团队面临着这么一个挑战:如何在不减慢应用交付速度的情况下,管理好安全风险.有种方法可以解决该问题,就是采用安全的 DevOps 工作流程. 安全的DevOps(也称为DevSecOps)会在从 ...
- 敏捷开发方法XP的12个最佳实践
极限编程(eXtreme Programming,简称XP)是一种轻量级.高效.低风险.柔性.可预测的.科学的软件开发方法,其特性包含在12个最佳实践中. 1. 计划游戏 ( Planning Ga ...
- 《配置管理最佳实践》——2.12 构建工程的前景
本节书摘来自异步社区<配置管理最佳实践>一书中的第2章,第2.12节,作者: [美]Bob Aiello , Leslie Sachs著,更多章节内容可以访问云栖社区"异步社区& ...
- 《AngularJS深度剖析与最佳实践》一2.12 单元测试
本节书摘来自华章出版社<AngularJS深度剖析与最佳实践>一书中的第2章,第2.12节,作者 雪狼 破狼 彭洪伟,更多章节内容可以访问云栖社区"华章计算机"公众号查 ...
- 表单展示界示例_联系表单页面设计的12个最佳实践(包括示例)
表单展示界示例 Do you want to improve your contact form page design? A good contact form page design encour ...
- 『每周译Go』Google:12 条 Golang 最佳实践
这是直接总结好的 12 条,详细的再继续往下看: 先处理错误避免嵌套 尽量避免重复 先写最重要的代码 给代码写文档注释 命名尽可能简洁 使用多文件包 使用 go get 可获取你的包 了解自己的需求 ...
- 12个面向专业开发人员的VueJS最佳实践
英文 | https://learnvue.co/2020/01/12-vuejs-best-practices-for-pro-developers/ 翻译 | 小爱 随着 VueJS的使用变得越来 ...
- 每个人都应该遵循的12个 SEO 最佳实践
大多数 SEO 最佳实践列表都塞满了糟糕的.过时的建议.要么是这样,要么他们专注于只适用于一小部分读者的事情.换句话说,它们是 SEO 技巧列表,而不是最佳实践.每个人都应该遵循最佳实践,无论您是经营 ...
- Nature综述:工程微生物组的通用原则和最佳实践
文章目录 NRM:工程微生物组的通用原则和最佳实践 摘要Abstract 专业词汇 正文 Main 设计微生物组(Designing microbiomes) 图1 |微生物组工程的设计-构建-测试- ...
- Dockerfile最佳实践
Docker 可以从 Dockerfile 中读取指令自动构建镜像,Dockerfile是一个包含构建指定镜像所有命令的文本文件.Docker坚持使用特定的格式并且使用特定的命令.你可以在 Docke ...
最新文章
- 100行代码搞定实时视频人脸表情识别(附代码)
- seaborn可视化绘制双变量分组条形图(Annotating Grouped Barplot: Side-by-side)、添加数值标签进行标记
- udacity 同学 pca 客户细分实例操作
- 如何安全存储比特币现金(BCH)?
- XenDesktop vDisk更新
- zbb20170606 oracle 查看空表
- linux下的FTP服务配置
- 图论 —— 图的搜索
- Eureka自我保护机制
- wpf中groupbox有什么用_日语中螃蟹用什么来数?
- ps4如何无线连接网络连接服务器,PC党最佳选择!达人发布PS4手柄无线连接PC教程...
- 北斗与GPS有哪些区别?
- JAVA 将byte数组类型的图片转换成换成JPEG格式
- “凸现”三围的健身运动法(图)
- 常见遥感卫星基本参数大全
- Labview各版本软件下载链接
- linux安全(1)
- 万达商业被曝暂停港股IPO:曾拟募资30亿美元 王健林梦难圆
- 科学摆放鼠标可以预防鼠标手
- Autodesk AutoCAD Mac版卸载教程