2021-07-28——正则表达式

一、正则表达式语法规则

正则表达式描述了一类字符串的特征,通过这个特征与特定的函数配合,对其它的字符串进行匹配、查找、替换及分割操作。并且这类字符串的特征是由一个或多个普通字符(比如a到z)2.元字符(有特殊功能的字符比如*、+、?等)组成的字符串。

例如:'/a/',a就是普通字符,/是定界符(表示正则表达式的开始或结束)


二、定界符

当使用 PCRE 函数的时候,模式需要由分隔符闭合包裹。 分隔符可以是任意非字母数字、非反斜线、非空白字符。 静默忽略合法分隔符之前的空白字符。经常使用的分隔符是正斜线(/)、hash符号(#) 以及取反符号(~)。({}、|、!)这些都可以。

注意:定界符放在正则表达式的起始位置,前后一致!


三、元字符

正则表达式的威力源于它可以在模式中拥有选择和重复的能力。 一些字符被赋予 特殊的涵义,使其不再单纯的代表自己,模式中的这种有特殊涵义的编码字符 称为 元字符

共有两种不同的元字符:一种是可以在模式中方括号外任何地方使用的,另外一种 是需要在方括号内使用的。 在方括号外使用的元字符如下:

方括号外的元字符
元字符描述
\一般用于转义字符
^或\A断言目标的开始位置(或在多行模式下是行首)
$或\Z断言目标的结束位置(或在多行模式下是行尾)
.匹配除换行符外的任何字符(默认)
[开始字符类定义([ ] 匹配方括号中的任意一个字符)
]结束字符类定义
|开始一个可选分支
(子组的开始标记(()将括号作为整体以便将其中的内容获取到)
)子组的结束标记
在正则表达式中,可以使用圆括号将某一段括起来,在圆括号后面部分,可以使用\\数字 来代表圆括号部分做匹配到的内容【\\数字   数字表示第几个圆括号】
?作为量词,表示 0 次或 1 次匹配(?前面的字符)。位于量词后面用于改变量词的贪婪特性。
*量词,0 次或多次匹配(放在*前面的那个字符可以出现0次或多次)
+量词,1 次或多次匹配(放在+前面的那个字符可以出现1次或多次)
{自定义量词开始标记(例如:{n}:表示前面的字符恰好出现n次)
}自定义量词结束标记(例如:{n,}表示前面的字符出现不少于n次)
{n,m}表示其前面的字符至少出现n次,最多出现m次
\d匹配任意一个十进制数字,等价于【1-9】
\D匹配任意一个除十进制数字以外字符,等价于【^0-9】
\s匹配任意一个空白字符,比如:换页符、回车符、制表符、垂直制表符
\S匹配任意一个除空白字符以外的一个字符
\w匹配任意一个数字或字母或下划线
\W匹配除数字、字母、下划线以外的任意一个字符

模式中方括号内的部分称为“字符类”。 在一个字符类中仅有以下可用元字符:

方括号内的元字符(字符类
元字符描述
\转义字符
^仅在作为第一个字符(方括号内)时,表明字符类取反
-标记字符范围

四、模式修饰符

模式修正符是在正则表达式的定界符之后使用,可以调整正则表达式的解释,扩展正则表达式在匹配、替换等操作时的某些功能,增强正则表达式的处理能力。(模式修饰符是可以多个搭配使用)

i (PCRE_CASELESS)

如果设置了这个修饰符,模式中的字母会进行大小写不敏感匹配。(在和模式匹配时不区分大小写)

m (PCRE_MULTILINE)

默认情况下,PCRE 认为目标字符串是由单行字符组成的(然而实际上它可能会包含多行), "行首"元字符 (^) 仅匹配字符串的开始位置, 而"行末"元字符 ($) 仅匹配字符串末尾, 或者最后的换行符(除非设置了 D 修饰符)。这个行为和 perl 相同。 当这个修饰符设置之后,“行首”和“行末”就会匹配目标字符串中任意换行符之前或之后,另外, 还分别匹配目标字符串的最开始和最末尾位置。这等同于 perl 的 /m 修饰符。(多行匹配)如果目标字符串 中没有 "\n" 字符,或者模式中没有出现 ^ 或 $,设置这个修饰符不产生任何影响。

s (PCRE_DOTALL)

如果设置了这个修饰符,模式中的点号元字符匹配所有字符,包含换行符。如果没有这个 修饰符,点号不匹配换行符。这个修饰符等同于 perl 中的/s修饰符。 一个取反字符类比如 [^a] 总是匹配换行符,而不依赖于这个修饰符的设置。

x (PCRE_EXTENDED)

如果设置了这个修饰符,模式中的没有经过转义的或不在字符类中的空白数据字符总会被忽略, 并且位于一个未转义的字符类外部的#字符和下一个换行符之间的字符也被忽略。 这个修饰符 等同于 perl 中的 /x 修饰符,使被编译模式中可以包含注释。 注意:这仅用于数据字符。 空白字符 还是不能在模式的特殊字符序列中出现,比如序列 (?( 引入了一个条件子组(译注: 这种语法定义的 特殊字符序列中如果出现空白字符会导致编译错误。 比如(?(就会导致错误)。

A (PCRE_ANCHORED)

如果设置了这个修饰符,模式被强制为"锚定"模式,也就是说约束匹配使其仅从 目标字符串的开始位置搜索。这个效果同样可以使用适当的模式构造出来,并且 这也是 perl 种实现这种模式的唯一途径。

D (PCRE_DOLLAR_ENDONLY)

如果这个修饰符被设置,模式中的元字符美元符号仅仅匹配目标字符串的末尾。如果这个修饰符 没有设置,当字符串以一个换行符结尾时, 美元符号还会匹配该换行符(但不会匹配之前的任何换行符)。 如果设置了修饰符m,这个修饰符被忽略. 在 perl 中没有与此修饰符等同的修饰符。

S

当一个模式需要多次使用的时候,为了得到匹配速度的提升,值得花费一些时间 对其进行一些额外的分析。如果设置了这个修饰符,这个额外的分析就会执行。当前, 这种对一个模式的分析仅仅适用于非锚定模式的匹配(即没有单独的固定开始字符)。

U (PCRE_UNGREEDY)    

(禁止贪婪匹配)

这个修饰符逆转了量词的"贪婪"模式。 使量词默认为非贪婪的,通过量词后紧跟? 的方式可以使其成为贪婪的。它同样可以使用 模式内修饰符设置 (?U)进行设置, 或者在量词后以问号标记其非贪婪(比如.*?)。

Note:

在非贪婪模式,通常不能匹配超过 pcre.backtrack_limit 的字符。

X (PCRE_EXTRA)

这个修饰符打开了 PCRE 与 perl 不兼容的附件功能。模式中的任意反斜线后就 ingen 一个 没有特殊含义的字符都会导致一个错误,以此保留这些字符以保证向后兼容性。 默认情况下,在 perl 中,反斜线紧跟一个没有特殊含义的字符被认为是该字符的原文。 当前没有其他特性由这个修饰符控制。

J (PCRE_INFO_JCHANGED)

内部选项设置(?J)修改本地的PCRE_DUPNAMES选项。允许子组重名, (译注:只能通过内部选项设置,外部的 /J 设置会产生错误。) 自 PHP 7.2.0 起,也能支持 J 修饰符。

u (PCRE_UTF8)

此修正符打开一个与 Perl 不兼容的附加功能。 模式和目标字符串都被认为是 UTF-8 的。 无效的目标字符串会导致 preg_* 函数什么都匹配不到; 无效的模式字符串会导致 E_WARNING 级别的错误。 5 字节和 6 字节的 UTF-8 字符序列以无效字符序列对待。


五、与正则表达式配合的函数

PCRE函数

  • preg_filter — 执行一个正则表达式搜索和替换
  • preg_grep — 返回匹配模式的数组条目
  • preg_last_error_msg — Returns the error message of the last PCRE regex execution
  • preg_last_error — 返回最后一个PCRE正则执行产生的错误代码
  • preg_match_all — 执行一个全局正则表达式匹配
  • 第四个参数(可选):PREG_PATTERN_ORDER       PREG_SET_ORDER  PREG_OFFSET_CAPTURE;第五个参数:可以传一个值,来表示从目标字符串的哪个位置开始搜索(单位是字节)
  • preg_match — 执行匹配正则表达式
  • 参数说明:第一个参数:正则表达式;第二个参数:目标字符串;第三个参数:放一个变量执行完后,里面会有匹配到的部分以及等等一些数据;第四个参数:可以传PREG_OFFSET_CAPTURE进入(那么第三个参数那个变量里面的数据就会有匹配到的部分偏移值,默认传的是0);第五个参数:可以传一个值,来表示从目标字符串的哪个位置开始搜索(单位是字节)
  • preg_quote — 转义正则表达式字符
  • preg_replace_callback_array — Perform a regular expression search and replace using callbacks
  • preg_replace_callback — 执行一个正则表达式搜索并且使用一个回调进行替换
  • preg_replace — 执行一个正则表达式的搜索和替换
  • 参数说明:1、第一个参数:正则表达式;  第二个参数:要替换成的字符串;第三个参数:目标字符串; 第四个参数(可选):默认是-1,就是替换左右符合特征的部分;第五个参数(可选):可以放一个变量          2、第一个参数与第二个参数传数组,一一对应的去替换 

  • preg_split — 通过一个正则表达式分隔字符串

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值