正则表达式:regular expression (regex)‘,用以描述具有某种特征模式的字符串

1. 序列

perl的正则表达式要么匹配某个字符串,要么不匹配,没有介于中间的部分匹配
perl会寻找从左起尽可能长的符合条件的匹配字符串

最简单的匹配模式是序列,要找什么字符直接写到匹配模式中

$_ = "yabba dabba doo";
if(/abba/){print "It matched!\n";
}

if语句的条件表达式中,2个斜线就是匹配操作符,默认用它匹配$_中的字符串,斜线之间的部分就是要匹配的模式

匹配过程是从最左侧开始尝试匹配的,找到之后不会继续看后面的dabba是否也匹配,这与全局匹配不一样

在perl模式中,空白字符值得关注,任何在模式中写明要匹配的空白字符,意思就是要寻找匹配$_中完全相同的空白字符

$_ = "yabba dabba doo";
if(/ab ba/){ # 不能匹配print "It matched!\n";
}$_ = "yabba dabba doo";
if(/ba da/){ # 能匹配print "It matched!\n";
}

写在匹配操作符中的模式文本相当于写在双引号内,比如\t和\n这样的特殊序列表示的就是制表符和换行符

制表符的N中表示方式

/coke\tsprite/ # \t表示制表符
/coke\N{CHARACTER TABULATION}sprite/ # \N{charname}
/coke\011sprite/ # 字符的八进制码
/coke\x09sprite/ # 字符的十六进制码
/coke\x{9}sprite/ # 字符的十六进制码
/coke${tab}sprite/ # 标量变量

perl在运行时先完成变量内插,取得表示模式的字符串后,再编译这个正则表达式,编译时如果发现这个字符串非法,会收到错误信息

$pattern = "(";
if(/$pattern/){print "It matched!\n"; # 编译错误,因为括号在perl中有特殊意义
}

用1个空的序列去匹配,配啥都唔那个匹配上

$_ = "yabba dabba doo";
if(//){print "It matched!\n";
}

根据“从最左侧起最长匹配”的原则,在字符串开始的位置总是可以匹配一个没有长度的序列

2. 动手实践不同模式

模式字符串可以用变量内插,改成从命令行接受参数,作为要要测试的模式是不是会更好?

while (<STDIN>){chomp;if(/$ARGV[0]/){ # 直接使用参数会有安全隐患print "\tMatches\n";}else{print "\tDoesn't match\n";}
}

因为输入的参数可以是任何东西,而perl拿到之后直接当正则表达式进行编译运算,所以从命令行接受参数会有安全隐患

% perl try_a_pattern "fred"
This will match fredMatches
But not BarneyDoesn't match

现在可以不改程序代码就直接测试不同模式了

% perl try_a_pattern "barney"
This will match fred (not)Doesn't match
But it will match barneyMatches

3. 通配符

点号. 能匹配除换行符外的任意单个字符
perl认为一般意义上我们要匹配的是换行符前的文本,那才是输入的内容,而换行符不过是行与行间的分隔,是格式的一部分

$_ = "yabba dabba doo!";
if(/doo./){ # 能匹配print "It matched!\n";
}$_ = "yabba dabba doo\n";
if(/doo./){ # 不能匹配print "It matched!\n";
}

如果像匹配实际的点号字符,需要先用反斜线转义

$_ = "yabba dabba doo.";
if (/doo\./){ # 能匹配print "It matched!\n";
}

perl5.12增加了另一个“能匹配除换行符外任意单个字符”的写法 \N

4. 量词

可以用量词来指定匹配项的重复次数,量词也是元字符,量词把它之前的字符作为要匹配的目标,然后定义它该重复匹配的次数

匹配次数 元字符 一般化写法
可有可无 ? {0,1}
0或多次 * {0,}
1次以上 + {1,}
至少多少次 {3,}
指定重复次数范围 {3,5}
准确的重复次数 {3}

5. 模式分组

用圆括号将模式字符串进行分组,圆括号也是元字符
量词只作用于它前面的那个字符,模式/fred+/匹配的是freddddddddd这样的字符串,因为量词+之前的是字母d。如果要匹配整个fred的重复次数,就需要用括号把fred括起来,写成/(fred)+/,这个时候匹配的是fredfredfred这样的字符串

圆括号还能帮助重复利用匹配上的字符串,可以使用反向引用(back reference),引用圆括号匹配到的字符
由于能取得匹配结果,这种括号围起来的分组叫做捕获分组(capture group)
反向引用:在反斜线后面接上数字,每个数字代表对应的捕获分组,按括号出现的先后次序而定

$_ = "abba";
if(/(.)\1/){ # 匹配连续出现的2个同样的字符,能匹配'bb'print "It matched same character next to itself!\n";
}$_ = "yabba dabba doo";
if(/y(....) d\1/){ # 反向引用不需要紧贴在对应捕获分组括号的右边print "It matched the same after y and d!\n";
}$_ = "yabba dabba doo";
if(/y(.)(.)\2\1/){ # 可以用多个括号形成不同分组,每个分组对应1个编号,1个编号对应1个反向引用,这个用来匹配像abba这样的回文print "It matched after the y!\n";
}$_ = "yabba dabba doo";
if (/y((.)(.)\3\2) d\1/){ # 如何知道某个分组对应的数字编号?不用管嵌套的情况,从左起数左括号出现的次序即可print "It matched!\n";
}

perl5.10引入了1个新的标记反向引用的写法 \g{N},其中g表示分组,N就是原来的数字编号,而\g{N}也可以简写为\gN

perl会据需创建反向引用,但只保留\1到\9的缓存

$_ = "aa11bb";
if(/(.)\111/){print "It matched!\n"; # 反向引用是\1还是\11或者是\111呢?计算机需要推测你的推测
}

编号数字可以使用负数,和python差不多

Perl-正则表达式相关推荐

  1. perl正则表达式-1

    .代表任何一个单字符,不匹配换行符. *是量词,表示前面内容出现0到多次. +也是量词,表示前面内容出现1到多次. 字符集简写     \d表示一个数字     \w表示一个单词字符()数字,字母,下 ...

  2. perl 正则表达式 引擎_Perl 5引擎概述

    perl 正则表达式 引擎 正如我在" 我的DeLorean运行Perl "中所述,切换到Perl极大地提高了我的开发速度和可能性. 在这里,我将更深入地研究Perl 5的设计,以 ...

  3. perl正则表达式匹配中文

    perl正则表达式匹配中文:/[^u4E00-u9FA5]/ js中正则表达式匹配中文:match(/[\u4E00-\u9FA5]/)

  4. Perl正则表达式讲解

    转载:http://blog.sina.com.cn/s/blog_607254630101cvx3.html 9.3.1 原则1 正则表达式有三种形式:匹配.替换和转换. 在表 9-1 中列有三种正 ...

  5. Perl 正则表达式

    Perl 正则表达式 正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串.将匹配的子串做替换或者从某个串中取出符合某个条件的子串等. Pe ...

  6. Perl——正则表达式

    Perl正则表达式 文章目录 Perl正则表达式 一.正则表达式的应用 二.正则表达式之元字符 2.1 转义 2.2 特殊匹配 2.3 匹配次数 2.4 各种括号 ( ),[ ],{ } 三.正则表达 ...

  7. Perl正则表达式(2) - 用正则表达式进行匹配

    Perl正则表达式 2. 用正则表达式进行匹配 2.1 用 m// 进行匹配 到目前为止,我们都是讲正则表达式的内容写在一对斜线内,如/fred/.但其实这是 m// 的简写,其中m代表match,和 ...

  8. Perl正则表达式(1) - 正则表达式基础知识

    Perl正则表达式 1. 基础知识 Perl中正则表达式(regular expression)默认匹配 $_ 中的字符串,匹配成功就返回真,否则返回假: Perl匹配正则表达式时,可以使用变量内插, ...

  9. 在 UltraEdit 和 UEStudio 中开始使用 Perl 正则表达式

    作为 UltraEdit/UEStudio 查找/替换功能中最强大的组件之一,Perl 正则表达式使您能够在一次替换中重新格式化大量非均匀数据,从而为您节省几分钟甚至几小时的手动文本编辑时间! 要搜索 ...

  10. 浅谈Perl正则表达式

    一.简介 Perl正则表达式中模式指在字符串中寻找的特定序列的字符,由反斜线包含:/def/即Perl正则表达式中模式def.其用法如结合函数split将字符串用某Perl正则表达式中模式分成多个单词 ...

最新文章

  1. android google 下拉刷新 csdn,android SwipeRefreshLayout google官方下拉刷新控件
  2. python爬取晋江_[Arcpy] 爬取高德地图面状地物(半自动化)—获取任意地区的行政边界...
  3. srs audio sandbox 注册机_Windows10自带 Sandbox软件测试必备技巧
  4. 2021年6月程序员平均工资 15052,你给行业拖后腿了吗?
  5. 运算放大器在超高频信号作用下的偏移量的变化
  6. 听说最近你读过不少书
  7. Thymelaf中使用select进行消息的回显
  8. 怎样查看已经记住密码的网站的密码
  9. 最小费用最大流-SPFA-多路增广
  10. 图神经网络(一)图信号处理与图卷积神经网络(3)图傅里叶变换
  11. 一图详解清华北大各学科全球权威排名
  12. Qt文档阅读笔记-Qt Core的官方解析
  13. RDP协议详细解析(三)
  14. JavaScript 学习笔记一 (入门篇)
  15. UCOS操作系统——系统内部任务(六)
  16. Android通过第三方软件打开Word、Excel、PPT、PDF等文档
  17. 安全基础:0-day漏洞
  18. 管理计算机找不到应用程序,电脑打开IE浏览器显示找不到应用程序如何解决
  19. windows宽带连接(校园网)自动连接脚本代码
  20. C语言的逻辑右移和算术右移

热门文章

  1. outlook邮箱日历华为手机与电脑同步设置
  2. 华为设备web登录,安全连接失败问题解决办法
  3. ddl/dml/dql/dcl
  4. 亿信华辰:能源行业数字化转型的目标是利用数据实现敏捷能源
  5. 台达vfd一ⅴe变频说明书_台达变频器VFD-E型号说明及功能介绍
  6. 获取 hexo主题静态页面
  7. android 原生日历,aCalendar使用体验 秒杀所有原生日程表
  8. 西门子培训1——RFID
  9. 多个input设置全选中的两种方式
  10. Hamibot企业微信自动打卡签到——仅作记录