PHP正则表达式核心技术彻底详解 第2节

做者:极客小俊 一个专一于web技术的80后
我不用拼过聪明人,我只须要拼过那些懒人 我就必定会超越大部分人!
CSDN@极客小俊,原创文章, B站技术分享
B站视频 : 👉 Bilibili.com 👈
我的博客: 👉 cnblogs.com 👈php

在这里插入图片描述

咱们接着上一节的
3. 量词
量词: 是用来修饰原子的, 默认状况量词下只能修饰前一个字符! 可使用 ( )来表示一个须要修饰的总体 ( )里面的表示一个单元、例如: (\w[abc])+java

量词是一种特殊的字符,是用来专门修饰原子[元字符]用的,不能够单独出现、不然会报警告错误!
注意: 上面说过若是量词要单独出现用来匹配字符串、若是要使用有意义的字符做为原子来使用,必须使用 ”\“转义字符转义 " \ " 转义字符能够将有意的字符转成没意义的字符 例如: .、*、+、?、 (、 <、>、也不必定必须是量词还有其余有意义的字符做为原子来匹配都必须转义!
经常使用量词python

  • : 表示其前的原子能够出现 0个、1个、或多个 等同于 {0,}
  • : 表示其前的原子必须出现1个 或 多个,不能没有,最少要有一个 等同于 {1,}
    ? :表示其前面的原子能够出现0次或1次 有只能有一次,要么没有 等同于 {0,1}
    {} : 表示用于自定义前面原子出现的次数
  1. {X} X表示一个整数, {5}表示前面的原子出现5次 就是必须出现X次
  2. {X,Y} X和Y表示一个整数,{2,5} X要小于Y, 表示前面出现的原子,最少X次,最多Y次,包括X和Y次、而且在X与Y范围之间的次数也包括!
  3. {X,} 表示前面的原子最少出现X次, 最多无限次
    { }更多解释意思:
    n{X} 匹配包含 X 个 n 的连续的字符串
    n{X,} 匹配至少包含 X 个 n 的连续的字符串
    n{X,Y} 匹配包含 X 或 Y 个 n 的连续的字符串

. 点默认状况下,表示除换行符外 任意一个字符!
以上案例测试以下:web

// * 符号测试
$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);

在这里插入图片描述

"点赞" "评论" "收藏"

你们的支持就是我坚持下去的动力!

若是以上内容有任何错误或者不许确的地方,欢迎在下面 👇 留个言指出、或者你有更好的想法,欢迎一块儿交流学习