第十二章:正则表达式

正则表达式就是子程序。就是文本匹配子程序。

壹肆伍.

一定要用/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相关推荐

  1. 生产中的12种容器镜像扫描最佳实践

    现在很多团队面临着这么一个挑战:如何在不减慢应用交付速度的情况下,管理好安全风险.有种方法可以解决该问题,就是采用安全的 DevOps 工作流程. 安全的DevOps(也称为DevSecOps)会在从 ...

  2. 敏捷开发方法XP的12个最佳实践

    极限编程(eXtreme Programming,简称XP)是一种轻量级.高效.低风险.柔性.可预测的.科学的软件开发方法,其特性包含在12个最佳实践中. 1.  计划游戏 ( Planning Ga ...

  3. 《配置管理最佳实践》——2.12 构建工程的前景

    本节书摘来自异步社区<配置管理最佳实践>一书中的第2章,第2.12节,作者: [美]Bob Aiello , Leslie Sachs著,更多章节内容可以访问云栖社区"异步社区& ...

  4. 《AngularJS深度剖析与最佳实践》一2.12 单元测试

    本节书摘来自华章出版社<AngularJS深度剖析与最佳实践>一书中的第2章,第2.12节,作者 雪狼 破狼 彭洪伟,更多章节内容可以访问云栖社区"华章计算机"公众号查 ...

  5. 表单展示界示例_联系表单页面设计的12个最佳实践(包括示例)

    表单展示界示例 Do you want to improve your contact form page design? A good contact form page design encour ...

  6. 『每周译Go』Google:12 条 Golang 最佳实践

    这是直接总结好的 12 条,详细的再继续往下看: 先处理错误避免嵌套 尽量避免重复 先写最重要的代码 给代码写文档注释 命名尽可能简洁 使用多文件包 使用 go get 可获取你的包 了解自己的需求 ...

  7. 12个面向专业开发人员的VueJS最佳实践

    英文 | https://learnvue.co/2020/01/12-vuejs-best-practices-for-pro-developers/ 翻译 | 小爱 随着 VueJS的使用变得越来 ...

  8. 每个人都应该遵循的12个 SEO 最佳实践

    大多数 SEO 最佳实践列表都塞满了糟糕的.过时的建议.要么是这样,要么他们专注于只适用于一小部分读者的事情.换句话说,它们是 SEO 技巧列表,而不是最佳实践.每个人都应该遵循最佳实践,无论您是经营 ...

  9. Nature综述:工程微生物组的通用原则和最佳实践

    文章目录 NRM:工程微生物组的通用原则和最佳实践 摘要Abstract 专业词汇 正文 Main 设计微生物组(Designing microbiomes) 图1 |微生物组工程的设计-构建-测试- ...

  10. Dockerfile最佳实践

    Docker 可以从 Dockerfile 中读取指令自动构建镜像,Dockerfile是一个包含构建指定镜像所有命令的文本文件.Docker坚持使用特定的格式并且使用特定的命令.你可以在 Docke ...

最新文章

  1. 100行代码搞定实时视频人脸表情识别(附代码)
  2. seaborn可视化绘制双变量分组条形图(Annotating Grouped Barplot: Side-by-side)、添加数值标签进行标记
  3. udacity 同学 pca 客户细分实例操作
  4. 如何安全存储比特币现金(BCH)?
  5. XenDesktop vDisk更新
  6. zbb20170606 oracle 查看空表
  7. linux下的FTP服务配置
  8. 图论 —— 图的搜索
  9. Eureka自我保护机制
  10. wpf中groupbox有什么用_日语中螃蟹用什么来数?
  11. ps4如何无线连接网络连接服务器,PC党最佳选择!达人发布PS4手柄无线连接PC教程...
  12. 北斗与GPS有哪些区别?
  13. JAVA 将byte数组类型的图片转换成换成JPEG格式
  14. “凸现”三围的健身运动法(图)
  15. 常见遥感卫星基本参数大全
  16. Labview各版本软件下载链接
  17. linux安全(1)
  18. 万达商业被曝暂停港股IPO:曾拟募资30亿美元 王健林梦难圆
  19. 科学摆放鼠标可以预防鼠标手
  20. Autodesk AutoCAD Mac版卸载教程

热门文章

  1. 学历不高的人,去学这5个技术,好找工作,上班也不累
  2. python学员管理系统
  3. 西门子博图功能指令(移动块)
  4. java put 请求_java发送put请求
  5. windows下仿Mac Dock软件MultiDock
  6. JS手写实现call、apply、bind
  7. 福永苹果服务器维修,苹果维修记录iphone app store更新打不开的解决方法
  8. python2 与 python3 共存
  9. 对HackTheBox里面的Bastion测试
  10. Docker的镜像管理