Perl正则表达式(1) - 正则表达式基础知识
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中我们可以使用圆括号()将模式字符分组,所以圆括号也是元字符。
- 在此之前,量词只作用于它之前的那个字符,使用()进行模式分组以后,此时量词对应要重复的就是()围起来的部分,比如/(fred)+/,可以匹配fredfredfred这样的字符。
- 可以反向引用圆括号()中匹配的字符,我们可以取得()中匹配的结果,又称这种分组为捕获分组。
表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) - 正则表达式基础知识相关推荐
- java 网络爬虫 正则表达式_【干货】Java网络爬虫基础知识
原标题:[干货]Java网络爬虫基础知识 引言 Java 网络爬虫具有很好的扩展性可伸缩性,其是目前搜索引擎开发的重要组成部分.例如,著名的网络爬虫工具 Nutch 便是采用 Java 开发,该工具以 ...
- 万物之始正则表达式全解析三部曲(上篇)-正则表达式基础知识及语法
前言 各位小伙伴大家好,接下来几天时间,我会从多个角度对正则表达式进行系统阐述,让你了解正则表达式的前世今生. 以下是博主整理的Linux知识专栏,喜欢的小伙伴可根据自己的需求自行订阅. Linux疑 ...
- python正则表达式使用实例_正则表达式的基础知识,以及Python爬虫中的使用方法...
一.正则表达式 实际上爬虫一共就四个主要步骤: 明确目标(要知道你准备在哪个范围或者网站去搜索) 爬(将所有的网站内容全部爬下来) 取(去掉对我们没有用处的数据) 处理数据 我们在第上一篇文章中介绍的 ...
- 1023day5:class类属性方法、每次执行类属性+1、内建模块、时间装饰器wrapper、面向对象__slots__方法:限制类的属性等基础知识、正则表达式基础知识、多态鸭子类型
文章目录 一.类class 1.Python类class 属性 方法 2.类的构造方法__init__() 3.每次执行一次类的属性+1 二.模块 1.内建模块 2.第三方模块 3.定义自己的模块 三 ...
- 帮你梳理正则表达式的基础知识
正则表达式在我们平时的工作中相当的常用,无论是写jmeter脚本,或者写自动化脚本,都可能会用到正则表达式.这篇文章主要梳理正则表达式的常用知识点,并结合一些具体的例子,让大家能掌握使用正则表达式的正 ...
- 正则表达式基础知识---文本操作(尚学堂视频笔记)
正则表达式(Regular Expression)基础知识 一.开发中使用流程: -分析要匹配的数据 写出测试用的典型数据 -在工具软件中进行匹配测试 -在程序中调用通过测试的正则表达式 (有些高级语 ...
- re正则表达式必备基础知识
Regular Expression Operations 正则表达式 正则表达式测试工具 一.原子 1.普通字符作为原子 2.非打印字符作为原子 3.通用字符作为原子 4.原子表 二.原子符 1.任 ...
- 正则表达式基础知识及应用(用于个人学习以及回顾)
一. 正则表达式概述 正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"). 正则表达式使用单 ...
- java学习--基础知识进阶第五天--API、 Object类 System类、日期相关类、包装类正则表达式...
今日内容介绍 u Object类 & System类 u 日期相关类 u 包装类&正则表达式 第1章 Object类 & System类 1.1 Object类 1.1. ...
最新文章
- R语言union函数计算数据对象(vector、list、dataframe)的并集:union函数计算两个vector向量、dataframe、列表list的并集
- python3编译exe_编译 – 如何将我的Python 3应用程序编译到.exe?
- 腾讯觅影:AI+医疗不光能诊断癌症,还可以很公益
- 分布式系统的那些事儿(六) - SOA架构体系
- mysql 导入文件夹_MySQL-导入与导出
- 云服务器虚拟主机区别,云服务器和虚拟主机的区别
- 因式分解 (10 分)
- mmorpg开发_MMORPG可以教给我们如何组建一支英勇的开发团队
- 力扣 342.4的幂
- matlab chirp函数模糊函数,8个OFDM-Chirp波形的时频域图及自(互)模糊函数图
- 手机app测试用例考虑测试点
- U8采购入库单单价修复sql
- linux 改变用户组、文件拥有者、文件属性
- MAC笔记本下Android 反编译apk文件最新版本
- 竞合关系会是云计算行业主流:阿里云发布新一代数据库
- 常用10个Excel快捷键,提高工作效率
- TimescaleDB部署
- ansible部署LAMP架构
- 解决VirtualBox不能为虚拟电脑打开一个新任务
- 看电影 --《山楂树之恋》