正则表达式笔记

作者: 溪水清澈

需要转义的字符(共15个): () [] {} ^ $ . ? + * / | \

数字键 ^ $ + * ( )

右小指上 [] {} |\

右小指下 . ? /

符号都可以使用\可行转义,不会出问题.

捕获:代表存储.

匹配:代表成功.

 

  • 元字符

.

单字符

 

?

{0,1}

 

 

懒惰模式

在保证匹配成功的前提下

尽可能少的匹配

*?

重复任意次

但尽可能少重复

+?

重复1次或更多次

但尽可能少重复

??

重复0次或1次

但尽可能少重复

{n,m}?

重复n到m次

但尽可能少重复

{n,}?

重复n次以上

但尽可能少重复

+

{1,}

 

*

{0,}  

 

|

分枝支

左右两边平等,而不只是单个字符.

 

  • 零宽断言, 正: 匹配成功, 预测先行: 看后面的位置

零宽断言

匹配一个位置

注意:仅仅是匹配一个位置而已

(?=exp)

零宽正预测先行断言

exp前面的位置

 

"cook(?=b)"只匹配下面的第二个cook

"cookacookbcookc"

(?=b)表示k和b之间的位置

(?<=exp)

零宽正回顾后发断言

exp后面的位置

"(?<=b)cook"只匹配下面的第二个cook

"acookbcookccook"

(?<=b)表示b和c之间的位置

(?!exp)

零宽负预测先行断言

非exp前面的位置

"cook(?!b)"匹配第一个和第三个cook

"cookacookbcookc"

(?<!exp)

零宽负回顾后发断言

非exp后面的位置

"(?<!b)cook"匹配第一个和第三个cook

"cookacookbcookc"

(?#comment)

注释.就当没有这段文字

"(?<=b)cook" =

"(?<=b)cook(?#comment)"

 

^

开始

断言:位置

$

结尾

断言:位置

\b

单词分割   

\B          断言:位置

 

  • 字符类

[]

自定义类,匹配单个字符

[^ ]始终会匹配换行符

{n,m}

重复次数

 

\

转义符

 

\d

数字

\D

\w

字母,数字,下划线,汉字

\W

\s

空白符

\S

\a

报警字符

 

\t

Tab

 

\r

Enter

 

\v

竖向制表符

 

\f

换而符

 

\n

换行符

 

\e

Escape

 

\xnn

十六进制

注意是两个字

\0nnn

八进制

注意是三个数

\unnnn

Unicode

 

\cN

=Ctrl+N

 

\A

疑似文件开头??

 

\Z

疑似文件结尾??

 

  • 命名子组, 反向引用

左括号从左至右出现的次序就是对应子组的下标(从1开始)

()

分组可重复多个字符,

"(a){3}"匹配三个 "a"

\分组号

引用()分组, 这个分组号不能用 {}

 

\g分组号

\g{分组号}

绝对或相对反向引用, 分组号可以是负数

 

\k<子组名>

\k'子组名'

\k{分组名}

\g{分组名}

反向引用子组, 引号是单引号

 

(?<name>exp)

(?'name'exp)

(?P<name>exp)

匹配exp,并捕获文本到

名称为name的组里

只能是<>, 不能是单引号哦

 

(?:exp)

匹配exp而不命名, 不捕获

 

  • 一次性子组, 即配置失败后, 不回溯, 不捕获

(?>子表达式)

虽然有括号, 但是不捕获

  • 条件子组

(?(条件)真表达式|假表达式)

条件是:

  1. 数字, 表示反向引用
  2. 字母R
  3. 0宽断言
  • preg_match_all

结果: 有几个子组, 便会有 几+1 个 数组元素

  • 递归

(?R) 表示递归执行 本正则表达式

递归和递归函数很相似,

$sub= 'a(b(c(def)g)h)i)j)k';

$pattern = '/\(((?>[^()]+)|(?R))*\)/';//用1,2.1,2.2,3表式这四种颜色

以下是匹配流程: 


	a
		1失败
	(
		1成功
	(b
		2.1成功
	(b(
		2.1失败
		2.2开始
			递归一
			1成功
	(b(c
			2.1成功
	(b(c(
			2.1失败
			2.2开始
				递归二
				1成功
	(b(c(def
				2.1成功
				2成功
	(b(c(def)
				2.1失败
				2.2开始
					递归三
					1失败, 
					递归三失败, 
				2.2失败
				2失败
				回溯
	(b(c(def		
				2成功
	(b(c(def)
				3成功
				到正则尾, 
				递归二结束,
				成功
			2.2成功
			2成功
	(b(c(def)g
			2.1成功
			2成功
	(b(c(def)g)	
			2失败
			失败
			回溯
	(b(c(def)g	
			2成功
	(b(c(def)g)
			3成功
		2.2成功
		2成功
	(b(c(def)g)h
		2成功
	(b(c(def)g)h)
		3成功
		正则表达式递归完成
	i
		从头开始匹配


 

 

 

(?1) 反向引用 第1子组正则表达式(注: 不是匹配到的内容, 而是表达式本身)

  • $pattern字符串使用单引号,

不然会出某些问题,比如反向引用捕获不到

为什么呢? 因为双引号, 会转义, 把一些 \ 给转义了.

$sub="abcccdefghhhijllleof";

$pat = "/(\w)\1{2}/";

preg_match_all($pat,$sub,$arr );

print_r($arr);

输出结果为空.

 

$sub="abcccdefghhhijllleof";

$pat = '/(\w)\1{2}/';

preg_match_all($pat,$sub,$arr );

print_r($arr);

这儿就正常.

 

 

 

[[:alpha:]]{2}  //此式表示匹配2个字母, 注意两个方括号

[:class:][:^class:]clasee为以下内容,比如[:alnum:]

alnum

字母和数字

alpha

字母

ascii

0 - 127的ascii字符

blank

空格和水平制表符

cntrl

控制字符

digit

十进制数(same as \d)

graph

打印字符, 不包括空格

lower

小写字母

print

打印字符,包含空格

punct

打印字符, 不包括字母和数字

space

空白字符 (比\s多垂直制表符)

upper

大写字母

word

单词字符(same as \w)

xdigit

十六进制数字

 

 

 

i(PCRE_CASELESS)大小写不敏感匹配.

m (PCRE_MULTILINE)多行匹配.

s (PCRE_DOTALL)DOT可以匹配"\n",否则不匹配.

x (PCRE_EXTENDED)忽略空白.

e(PREG_REPLACE_EVAL)替换后执行


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值