Perl正则表达式

1. 基础知识

  • Perl中正则表达式(regular expression)默认匹配 $_ 中的字符串,匹配成功就返回真,否则返回假;
  • Perl匹配正则表达式时,可以使用变量内插,先完成变量内插,取出变量中的字符串后,编译正则表达式。

1.1 regex中的通配符

  • 点号 . (元字符)

    • 可以匹配除换行符 \n 之外的任意单个字符;
    • 点号 . 代表的不是它字符本身,但是可以匹配点这个字符(可以匹配自己)
    • 只想匹配单个点 . 字符,可以先用反斜线转义 .
    • 如果不喜欢使用点 . ,可以使用\N,效果一致 (后面介绍\N的含义)

1.2 regex中的量词

  • Perl中用到的常见量词包括 * + ? ,其具体含义见下表。
    表1.2 正则表达式量词以及对应的广义形式
匹配次数 元字符 广义写法 示例 说明
可有可无 {0,1} /ab?a/ 字符b可以出现一次或者不出现
零次或多次 * {0,} /ab*a/ 字符b可以不出现或者出现多次
一次或多次 + {1,} /ab+a/ 字符b可以出现一次或者出现多次
最少n次 {3,} /ab{3,}a/ 字符b至少出现三次
指定重复范围 {2,5} /ab{2,5}a/ 字符b出现2~5次
指定准确次数 {8} /ab{8}a/ 字符b只能出现8次

1.3 regex中的模式分组

  • perl中我们可以使用圆括号()将模式字符分组,所以圆括号也是元字符。
  1. 在此之前,量词只作用于它之前的那个字符,使用()进行模式分组以后,此时量词对应要重复的就是()围起来的部分,比如/(fred)+/,可以匹配fredfredfred这样的字符。
  2. 可以反向引用圆括号()中匹配的字符,我们可以取得()中匹配的结果,又称这种分组为捕获分组

表1.3 模式分组匹配示例及相关说明 (以字符串"abbbabbb"为例)

示例字符串 示例 匹配结果 情况说明
abba /(.)\1/ 匹配第一个"bb" (.)为模式分组,\1为捕获分组
yabb dabb /y(…) d\1/ 匹配整个字符串 ()圆括号中可以包含多个字符,\1表示反向引用第一组模式
yabba dabba /y(.)(.)\2\1/ 匹配’abba’ \2表示反向引用第二组模式分组(第二组圆括号中匹配的字符)
yabba dabba /y((.)(.)\3\2) d\1/ 匹配整个字符串 反向引用中的数字指的是第几个左方括号中的内容
aa11bb /(.)\g{1}11/ 匹配’aa11’ \g{n}中的n指的是反向引用第n个左圆括号中的内容 (绝对位置)
aa11bb /(.)\g{-1}11/ 匹配’aa11’ \g{n}中的n指的是反向引用左侧最靠近它的第n个左圆括号中的内容(相对位置)

1.4 regex中的择一匹配

  • 模式中的竖线字符 | ,也叫作或,表示择一匹配,要么左侧部分匹配,要么右侧部分匹配(左侧优先)
#!/usr/bin/perl
#包含两个操作符
foreach (qw/fred betty barney dino/) {if (/fred|betty/) {print "$_\n";}
}
#Result
fred
betty
#包含三个操作符
foreach (qw/fred betty barney dino/) {if (/fred|betty|barney/) {print "$_\n";}
}
#Result
fred
betty
barney
#其他使用方式
if (/fred|betty barney/)    #匹配fred或batty barney,等于/fred|(betty barney)/的结果
if (/(fred|betty) barney/)  #使用圆括号限制可选区域,匹配fred barney 或 betty barney
if (/fred( |\t)+barney/)    #可以匹配fred和betty之间至少有一个以上空格或者制表符
if (/fred( +|\t)barney/)    #fred和barney之间有一个以上空格或者一个制表符时匹配成功

1.5 regex中的字符集

  • 模式中的字符集是指单个位置上能匹配的各种模式字符的集合,我们可以把这些字符归集到方括号中,比如[abcdef],只要某个位置上出现的字符是这6个字符中的任意一个,就算匹配成功。
  • 为了定义方便,我们可以使用连字符(-)指定范围如[a-zA-Z]表示所有英文字母的大小写,[0-9]表示所有数字等
    • 字符集中如果需要匹配连字符本身:
    • 要么转义[a-z],只匹配a,连字符,z三个字符;
    • 要么将连字符写在首位处,如[-a],[b-]
  • 某些时候,反过来指定要排除匹配的字符更为方便,那么只需要在字符集内部的开头加上脱字符^
    • [^def] #任何一个不是d e f的字符
    • [^n-z] #小写 n 到 z 的所有字符都不行,其他字符可以
    • [^n\-z] #小写字符 n z 和连字符 - 不可以,其他都可以
  • 字符集的简写

表1.5 字符集的简写及对应的反义形式

简写 匹配 说明
\d 十进制数字 匹配数字0 ~ 9
\D 非十进制数字 匹配数字0 ~ 9之外的其他字符
\s 空白字符 [\f\t\n\ ]等字符(未完待续)
\S 非空白字符 除[\f\t\n\ ]之外的字符
\h 水平空白字符 [\t\ ] v5.10开始支持
\H 非水平空白字符 [\t\ ]之外的其他字符 v5.10开始支持
\v 纵向空白字符 (待补充)
\V 非纵向空白字符 (待补充)
\R 一般化的行结尾字符 包含\n, \r\n 及Unicode中定义的换行符
\w 单词字符 单词包括字母,数字,下划线
\W 非单词字符 字母,数字,下划线之外的字符
\n 换行符 不是真正意义的简写,就是一个字符
\N 非换行符 换行符之外的任意字符,和 点 . 一致

Perl正则表达式(1) - 正则表达式基础知识相关推荐

  1. java 网络爬虫 正则表达式_【干货】Java网络爬虫基础知识

    原标题:[干货]Java网络爬虫基础知识 引言 Java 网络爬虫具有很好的扩展性可伸缩性,其是目前搜索引擎开发的重要组成部分.例如,著名的网络爬虫工具 Nutch 便是采用 Java 开发,该工具以 ...

  2. 万物之始正则表达式全解析三部曲(上篇)-正则表达式基础知识及语法

    前言 各位小伙伴大家好,接下来几天时间,我会从多个角度对正则表达式进行系统阐述,让你了解正则表达式的前世今生. 以下是博主整理的Linux知识专栏,喜欢的小伙伴可根据自己的需求自行订阅. Linux疑 ...

  3. python正则表达式使用实例_正则表达式的基础知识,以及Python爬虫中的使用方法...

    一.正则表达式 实际上爬虫一共就四个主要步骤: 明确目标(要知道你准备在哪个范围或者网站去搜索) 爬(将所有的网站内容全部爬下来) 取(去掉对我们没有用处的数据) 处理数据 我们在第上一篇文章中介绍的 ...

  4. 1023day5:class类属性方法、每次执行类属性+1、内建模块、时间装饰器wrapper、面向对象__slots__方法:限制类的属性等基础知识、正则表达式基础知识、多态鸭子类型

    文章目录 一.类class 1.Python类class 属性 方法 2.类的构造方法__init__() 3.每次执行一次类的属性+1 二.模块 1.内建模块 2.第三方模块 3.定义自己的模块 三 ...

  5. 帮你梳理正则表达式的基础知识

    正则表达式在我们平时的工作中相当的常用,无论是写jmeter脚本,或者写自动化脚本,都可能会用到正则表达式.这篇文章主要梳理正则表达式的常用知识点,并结合一些具体的例子,让大家能掌握使用正则表达式的正 ...

  6. 正则表达式基础知识---文本操作(尚学堂视频笔记)

    正则表达式(Regular Expression)基础知识 一.开发中使用流程: -分析要匹配的数据 写出测试用的典型数据 -在工具软件中进行匹配测试 -在程序中调用通过测试的正则表达式 (有些高级语 ...

  7. re正则表达式必备基础知识

    Regular Expression Operations 正则表达式 正则表达式测试工具 一.原子 1.普通字符作为原子 2.非打印字符作为原子 3.通用字符作为原子 4.原子表 二.原子符 1.任 ...

  8. 正则表达式基础知识及应用(用于个人学习以及回顾)

    一. 正则表达式概述 正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"). 正则表达式使用单 ...

  9. java学习--基础知识进阶第五天--API、 Object类 System类、日期相关类、包装类正则表达式...

    今日内容介绍 u  Object类 & System类 u  日期相关类 u  包装类&正则表达式 第1章 Object类 & System类 1.1 Object类 1.1. ...

最新文章

  1. R语言union函数计算数据对象(vector、list、dataframe)的并集:union函数计算两个vector向量、dataframe、列表list的并集
  2. python3编译exe_编译 – 如何将我的Python 3应用程序编译到.exe?
  3. 腾讯觅影:AI+医疗不光能诊断癌症,还可以很公益
  4. 分布式系统的那些事儿(六) - SOA架构体系
  5. mysql 导入文件夹_MySQL-导入与导出
  6. 云服务器虚拟主机区别,云服务器和虚拟主机的区别
  7. 因式分解 (10 分)
  8. mmorpg开发_MMORPG可以教给我们如何组建一支英勇的开发团队
  9. 力扣 342.4的幂
  10. matlab chirp函数模糊函数,8个OFDM-Chirp波形的时频域图及自(互)模糊函数图
  11. 手机app测试用例考虑测试点
  12. U8采购入库单单价修复sql
  13. linux 改变用户组、文件拥有者、文件属性
  14. MAC笔记本下Android 反编译apk文件最新版本
  15. 竞合关系会是云计算行业主流:阿里云发布新一代数据库
  16. 常用10个Excel快捷键,提高工作效率
  17. TimescaleDB部署
  18. ansible部署LAMP架构
  19. 解决VirtualBox不能为虚拟电脑打开一个新任务
  20. 看电影 --《山楂树之恋》

热门文章

  1. 孩之宝旗下品牌变形金刚开启“虎虎声威”新年主题活动
  2. g2o之SE3-SE3约束
  3. 智慧工地管理平台系统—智慧工地整体解决方案
  4. opencv ocr文字识别_用OpenCV和OCR识别图片中的表格数据
  5. 《从0到1》笔记 第一章 未来的挑战
  6. 转载:CK44和CKR1的区别
  7. List集合常用方法总结
  8. Unicode 与 UTF-8 编码的转换
  9. 大数据开发岗会被淘汰吗?大数据岗位已经饱和了吗?
  10. “他,程序猿,35岁,被劝退”:不要只懂代码,会说话,胜过10倍默默努力