PHP正则表达式核心技术完全详解 第2节
作者:极客小俊 一个专注于web技术的80后
我不用拼过聪明人,我只需要拼过那些懒人 我就一定会超越大部分人!
CSDN@极客小俊,原创文章, B站技术分享
B站视频 : Bilibili.com
个人博客: cnblogs.com
我们接着上一节的
3. 量词
量词: 是用来修饰原子的, 默认情况量词下只能修饰前一个字符! 可以使用 ( )来表示一个需要修饰的整体 ( )里面的表示一个单元、例如: (\w[abc])+
量词是一种特殊的字符,是用来专门修饰原子[元字符]用的,不可以单独出现、否则会报警告错误!
注意: 上面说过如果量词要单独出现用来匹配字符串、如果要使用有意义的字符作为原子来使用,必须使用 ”\“转义字符转义 " \ " 转义字符可以将有意的字符转成没意义的字符 例如: .、*、+、?、 (、 <、>、也不一定必须是量词还有其他有意义的字符作为原子来匹配都必须转义!
常用量词
- : 表示其前的原子可以出现 0个、1个、或多个 等同于 {0,}
- : 表示其前的原子必须出现1个 或 多个,不能没有,最少要有一个 等同于 {1,}
? :表示其前面的原子可以出现0次或1次 有只能有一次,要么没有 等同于 {0,1}
{} : 表示用于自定义前面原子出现的次数
- {X} X表示一个整数, {5}表示前面的原子出现5次 就是必须出现X次
- {X,Y} X和Y表示一个整数,{2,5} X要小于Y, 表示前面出现的原子,最少X次,最多Y次,包括X和Y次、并且在X与Y范围之间的次数也包括!
- {X,} 表示前面的原子最少出现X次, 最多无限次
{ }更多解释意思:
n{X} 匹配包含 X 个 n 的连续的字符串
n{X,} 匹配至少包含 X 个 n 的连续的字符串
n{X,Y} 匹配包含 X 或 Y 个 n 的连续的字符串
. 点默认情况下,表示除换行符外 任意一个字符!
以上案例测试如下:
// * 符号测试
$pattern="/a9*f/";
$subject='a999f';
// + 符号 测试
$pattern="/a9+f/";
$subject='a999f';
// ? 符号 测试
$pattern="/a9?f/";
$subject='a999f';
// { } 符号 测试
$pattern="/a9{3}f/";
$subject='a999f';
$pattern="/a9{1,100}f/";
$subject='a999f';
$pattern="/a9{1,}f/";
$subject='a999f';
// . 符号 测试
$pattern="/a9.f/";
$subject='a9@f';
$pattern="/a9.+f/";
$subject='a9@@@@@@f';
//正则匹配
preg_match($pattern, $subject,$arr);
//自定义打印show函数
show($arr);
^ : 正则表达式的第一个字符出现, 表示必须以这个正则开始,表示以什么开头
$ : 正则表达式的最后一个字符出现, 表示必须以这个正则结束, 表示以什么结尾
注意: 这里的开始与结尾匹配的字符要看一下是一组还是单一字符, 案例如下:
$pattern="/^www.+com$/";
$subject='www.sina.com';
//正则匹配
preg_match($pattern, $subject,$arr);
//自定义打印show函数
show($arr);
小提示: ^与$ 在开始与结尾匹配的时候 中间如果没有任何其他任意字符就是匹配自己本身,案例如下
$pattern="/^wwwcom$/";
$subject='wwwcom';
//正则匹配
preg_match($pattern, $subject,$arr);
//自定义打印show函数
show($arr);
断言匹配基础
断言匹配就是查找一个是与不是的关系!
?=n : 表示前面的原子其后 有紧接指定的字符串 [n 的字符串].
语法: '/regexp(?=n)/'
案例图如下:
$pattern="/you(?= are)/";
$subject='Now that you are up and runing, here are you are few things you should know.';
//正则匹配
preg_match_all($pattern, $subject,$arr);
//自定义打印show函数
show($arr);
?!n : 表示前面的原子其后 没有紧接指定的字符串 [n 的任何字符串]
语法: '/regexp(?!n)/'
案例如1:
$pattern="/you(?! are)/";
$subject='Now that you are up and runing, here are you are few things you should know.';
//正则匹配
preg_match_all($pattern, $subject,$arr);
//自定义打印show函数
show($arr);
案例如2: 指定p后面不是h的单词
$pattern="/\bp(?!h).+\b/is";
$subject='php python perl java';
//正则匹配
preg_match_all($pattern, $subject,$arr);
//自定义打印show函数
show($arr);
有关断言匹配高级的介绍 后面会说到!
4. 或者匹配 与 小括号:
| : 表示或的关系 , 它的优先级是最低的, 最后考虑它的功能
$pattern="/www|com|http/";
$subject='www.baidu.com.http';
//正则匹配
preg_match_all($pattern, $subject,$arr);
//自定义打印show函数
show($arr);
( ) : 小括号的作用: 重点
它里面的所有代表一个模式单元,如果需要匹配整体字符就需要加上()
a. 可以把一堆字符作为一个整体使用
b. 改变优先级,加上括号可以提高优先级别
c. 作为子模式使用, 正则表达式不先对一个字符串匹配一次, 全部匹配作为一个大模式,放到数组的第一个元素中,每个()是一个子模式按顺序放到数组的其它元素中去。
d. 可以取消子模式, 在括号中最前面使用 ?: 就可以取消这个()表示的子模式,这种也可以称之为:不缓存子模式, 因为子模式本身就是一种缓存在内存中的数据! 总之: (?:xxxx)? 如果有就匹配,没有就取消当前子模式!
e. 反向引用:
a) 可以在模式中直接将子模式取出来,再作为正则表达式模式的一部分
b) \1 取第一个子模式、 \2取第二个子模式, .... \5 (注意是单引号还是双引号引起来的正则) 双引号需要转义 “\1” 单引号不需要转义 '\1'
c) 如果是在正则表达式像替换函数preg_replace函数中, 可以将子模式取出, 在被替换的字符串中使用
d) 反向引用可以使用${n}来 表示 并且推荐这样使用!
案例图如下:
//普通匹配全部
$pattern="/\d{4}\W\d{2}\W\d{2}\s*\d{2}\W\d{2}\W\d{2}/";
$subject='2020-05-22 21:55:16';
//普通匹配全部 + 子模式
$pattern="/(\d{4}\W\d{2}\W\d{2})\s*(\d{2}\W\d{2}\W\d{2})/";
$subject='2020-05-22 21:55:16';
//普通匹配全部 + 子模式 + 子模式嵌套
$pattern="/((\d{4})\W(\d{2})\W(\d{2}))\s*(\d{2}\W\d{2}\W\d{2})/";
$subject='2020-05-22 21:55:16';
//普通匹配全部 + 子模式 + 子模式嵌套 + 去掉子模式
$pattern="/((\d{4})\W(?:\d{2})\W(?:\d{2}))\s*(\d{2}\W\d{2}\W\d{2})/";
$subject='2020-05-22 21:55:16';
//反向引用, 注意:要注意我上面所说的正则的单双引号问题,
//单引号
$pattern='/\d{4}(\W)\d{2}(\W)\d{2}\s*\d{2}\1\d{2}\2\d{2}/';
$subject='2020:05:22 21:55:16';
//双引号
$pattern="/\d{4}(\W)\d{2}(\W)\d{2}\s*\d{2}\\1\d{2}\\2\d{2}/";
$subject='2020-05-22 21-55-16';
5 . 特别的元字符 匹配边界 或者叫 边界控制
\b : 表示一个字符的边界 意思是最后找到的那个字符作为边界! 说明的是字符串前或后没有其他字符
案例1 如下: 以b字符为开始边界、以u字符结尾边界
$pattern="/\bb.+u\b/";
$subject='www.baidu.com';
$pattern="/\bb.+?u\b/";
$subject='www.baidu.com baidu';
案例2 如下:
$pattern="/\btr.+l\b/";
$subject='Look forward to a wayward travel, the';
//正则匹配
preg_match_all($pattern, $subject,$arr);
//自定义打印show函数
show($arr);
案例3 如下
//这里的 -? 是匹配是否有负数
$pattern="/-?\b\d+\b/is";
$subject='cc 66 aaa 999 eee 100,-56';
//正则匹配
preg_match_all($pattern, $subject,$arr);
//自定义打印show函数
show($arr);
\B : 表示一个非边界 : 说明的是字符串前或后有其他字符 是连续的 不要有边界
案例1如下:
$pattern="/\Btr.+l\b/is";
$subject='Look forward to a waywardtravel, the';
//正则匹配
preg_match_all($pattern, $subject,$arr);
//自定义打印show函数
show($arr);
案例2:
$pattern="/\Bwar\B/is";
$subject='Look forward to a waywardtravel, the';
//正则匹配
preg_match_all($pattern, $subject,$arr);
//自定义打印show函数
show($arr);
匹配边界
\A : 表示只匹配整段字符串的开头, 它不受m 修正符的影响,
因为m修正符只针对^ 和 $起作用, 但对\A无效
如下案例:
//注意字符串是双引号
$subject="h1111\nh22222\nh33333";
$pattern="/\Ah\d+$/m";
//正则匹配
preg_match_all($pattern, $subject,$arr);
//自定义打印show函数
show($arr);
\Z: 表示只匹配整段字符串的最后结尾: 它也不受m 修正符的影响,
因为m修正符只针对^ 和 $起作用, 但对\Z无效
如下案例:
//注意字符串是双引号
$subject="h1111\nh22222\nh33333";
$pattern="/^h\d+\Z/m";
//正则匹配
preg_match_all($pattern, $subject,$arr);
//自定义打印show函数
show($arr);
小提示: 如果对m 修正符不了解 请看下面介绍.
\z: 表示只匹配整段字符串的最后结尾: 但是字符串最后不能跟任何东西
例1:
//注意字符串是双引号
$subject="h1111\nh22222\nh33333";
//$subject="h1111\nh22222\nh33333aaa";
//$subject="h1111\nh22222\nh33333%";
$pattern="/^h\d+\z/m";
//正则匹配
preg_match_all($pattern, $subject,$arr);
//自定义打印show函数
show($arr);
例2:
//注意字符串是双引号
$subject="h1111\nh22222\nh33333";
//$subject="h1111\nh22222\nh33333aaa";
//$subject="h1111\nh22222\nh33333%";
$pattern="/h\d+\z/";
//正则匹配
preg_match_all($pattern, $subject,$arr);
//自定义打印show函数
show($arr);
"点赞" "评论" "收藏"
大家的支持就是我坚持下去的动力!
如果以上内容有任何错误或者不准确的地方,欢迎在下面 留个言指出、或者你有更好的想法,欢迎一起交流学习
PHP正则表达式核心技术完全详解 第2节的更多相关文章
- PHP正则表达式核心技术完全详解 第1节
作者:极客小俊 一个专注于web技术的80后 我不用拼过聪明人,我只需要拼过那些懒人 我就一定会超越大部分人! CSDN@极客小俊,原创文章, B站技术分享 B站视频 : Bilibili.com 个 ...
- JMeter 后置处理器之正则表达式提取器详解
后置处理器之正则表达式提取器详解 by:授客 QQ:1033553122 1. 添加正则表达式提取器 右键线程组->添加->后置处理器->正则表达式提取器 2. 提取器配置介绍 ...
- Jmeter 正则表达式提取器详解(Regular Expression Exactor)
Jmeter 正则表达式提取器详解(Regular Expression Exactor) Name(名称):随意设置,最好有业务意义. Comments(注释):随意设置,可以为空 Apply to ...
- - > 并查集详解(第二节)
以下是并查集思路详解: 一:概念 并查集处理的是“集合"之间的关系.当给出两个元素的一个无序数对(a,b)时,需要快速“合并”a和b分别所在的集合,这期间需要反复“查找”某元素所在的集合.“ ...
- C#关键字详解第五节
最近有点忙于追剧<人民的名义>所以并未及时更新,所以大家理解理解,哈哈,这部剧很不错!推荐大家去 看看!下面我们继续C#关键字解释! const:常量 一般我们说常量都是以PI(3.14) ...
- C#正则表达式语法规则详解
正则表达式通常包含字母文本(Literaltext)和元字符(metacharacter) 字母文本指的是普通文本如"abcde"可匹配字符串中任何包含"abcde&qu ...
- C#中Spli、正则表达式分解字符串详解
一.String.Split方法提供了如下6个重载函数: 名称 说明 String.Split (Char[]) 返回包含此实例中的子字符串(由指定 Char 数组的元素分隔)的 String 数组. ...
- notepad++正则表达式替换字符串详解
正则表达式是一个查询的字符串,它包含一般的字符和一些特殊的字符,特殊字符可以扩展查找字符串的能力,正则表达式在查找和替换字符串的作用不可忽视,它 能很好提高工作效率. EditPlus的查找,替换,文 ...
- 身份证号码的正则表达式及验证详解(JavaScript,Regex)
简言 在做用户实名验证时,常会用到身份证号码的正则表达式及校验方案.本文列举了两种验证方案,大家可以根据自己的项目实际情况,选择适合的方案. 身份证号码说明 居民身份证号码,正确.正式的称谓应该是&q ...
随机推荐
- 简明python教程--读后感--推荐给python新手
原书名: A Byte of Python作者: Swaroop, C. H.译者: 沈洁元出版社: 未知 优点 1. 讲解很详细,很基础,适合入门,对编译器也做了简单的介绍 2. ...
- go语言之函数及闭包
一:函数 1 概述: 函数是 Go 程序源代码的基本构造单位,一个函数的定义包括如下几个部分,函数声明关键字 也町. 函数名.参数列表.返回列表和函数体.函数名遵循标识符的命名规则, 首字母的大小写决 ...
- element-ul二次封装table表格
在项目中el的表格使用的地方太多了,若不进行封装,使用的时候页面会显得非常的冗余且难以维护,有时表格样式还不能做到一致:今天分享一个在工作中封装的表格 由于大多代码都在页面有介绍,就不在外面解释了 一 ...
- CET-4 Word 计划表
a {text-decoration: none} CET-4 计划表 Sun Mon Tue Wed Thu Fri Sat 9/1 List-1 9/2 List-2 *List-1 9/3 Li ...
- Photon Server伺服务器在LoadBalancing的基础上扩展登陆服务
一,如何创建一个Photon Server服务 参见此博客 快速了解和使用Photon Server 二, 让LoadBalancing与自己的服务一起启动 原Photonserver.config文 ...
- 两篇好文 清晰地描述bug 技术总监的忠告
如何清晰的描述一个bug 一个技术总监的忠告 --2020-02-26--
- hyperledger fabric 智能合约开发
开发步奏: 1.创建教育联盟 2.区块链服务平台自动生成通道id 3.区块链网络服务人员通过命令行在区块链网络中创建对应通道 4.创建相关教育组织 5.邀请相关组织加入联盟 6.区块链网络管理人员通过 ...
- 上传文件到服务器指定位置 & 从服务器指定位置下载文件
需要的jar包: 去maven仓库自己搜索com.jcraft下载jar包 <dependency> <groupId>com.jcraft</groupId> & ...
- 前端插入date类型的数据到数据库
//插入 @Override public boolean insertEmp(Emp emp) { String sql = "insert into emp(lwlEmpno,lwlEn ...
- IMX6ULL开发板Linux_WIFI驱动实验
1.在迅为i.MX6ULL开发板上使用的是 usb 接口的 RTL8723 wifi 模块,原理图如下所示:可以看到 RTL8723 模块的接口非常简单,只有 DP1 和 DM1 连接到 usb HU ...