文章目录
前言
开发中遇到关于字符串匹配和校验,使用正则表达式可以高效快速的实现上述的功能,现记录一下
一、正则表达式是什么?
正则表达式又称为匹配模式(Pattern
) , 由一组具有特定含义的字符串构成,通常用于匹配和文本替换。
百度百科解释:
正则表达式,又称规则表达式。(英语:Regular
Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
维基百科解释:
Wiki:正则表达式(英语:Regular
Expression、regex或regexp,缩写为RE),也译为正规表示法、常规表示法,在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。
二、正则基本语法
1.行定位符(^ 和 $)
^
表示行开始,例: ^For 表示以For开头
$
表示行结束,例: $th 表示以th结尾
若同时使用了^和$则表示为 精确匹配,只可能为全部匹配或不匹配,不存在多个匹配项
2.选择字符( | ),‘或’
通过|
符号,表示可以符合为多个模式的其中一种即认为匹配。
例如: a|f|n 表示只能是a、f、n三个字符中的某个才匹配
3.单字符匹配([]
)
使用[]
用于对单个字符模式的定义:
例如:^[a|F|G] 表示首字母只能为a、F、G
4.排除字符(^),‘非’
符号^
和[]
结合使用表示为排除字符的含义:
例如:[^F] 表示不能为F
注意:
使用”[]”与”|”的区别,在于”[]”只能匹配单个字符,而”|”可以匹配任意长度的字符串。在使用”[]”的时候,往往配合连接字符”-“一起使用,如[a-d],代表a或b或c或d。
5.限定符(?
、*
、+
、 {n,m}
)
限定符主要是用来限定每个字符串出现的次数。
限定符号 | 含义 | 示例 |
---|---|---|
? | 表示可以出现零次或一次 | F? – 表示匹配一次或零次F |
* | 表示可以出现零次或多次 | [a\|b]* – 表示匹配零次或多个由a或b组成的字符串 |
+ | 表示可以出现一次或多次 | A+ – 表示由一个或多个A构成的字符串 |
{n} | 表示可以出现n次 | [a-z]{3} – 表示匹配由小写字母构成的长度为3的字符串 |
{n,} | 表示至少需要出现n次 | [a-z]{3,} – 表示匹配由小写字母构成的长度至少为3的字符串 |
{n,m} | 表示可以出现n到m次 | [A-Z0-9]{2,20} – 表示匹配由大写字母和数字构成的长度2-20的字符串 |
6.点操作符(.)
点操作符可以匹配不包括换行符(\n
)的任何一个字符
7.表达式中的反斜杠(\)
表达式中的反斜杠表示转义、指定的预定义的字符集、断言、显示不打印的字符
7.1转义字符
匹配有特殊含义的字符,如: ? * . 等
7.2 指定预定义的字符集
常用的字符集包含:
字符 | 含义 | 等价表示 |
---|---|---|
\d | 表示任意一个十进制数字 | [0-9] |
\D | 表示任意一个的非十进制数字 字符 | [^0-9] |
\s | 表示任意一个空白字符(空格、换行、换页、回车、制表符) | [\n|\r|\t|\f|\v] ,\v 表示纵向制表、\f表示换页符 |
\S | 表示任意一个非空白字符的字符 | ^[\n|\r|\t|\f|\v] |
\w | 表示任意一个单词字符 | [a-zA-Z0-9] |
\W | 表示单个非单词字符 | ^[a-zA-Z0-9] |
7.3 显示不可打印的字符
字符 | 含义 |
---|---|
\a | 报警 |
\b | 退格 |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 横向制表 |
\v | 纵向制表 |
8.括号字符() , 用于改变符号的作用分组
在正则表达式中小括号的作用主要有:
改变限定符如(|、* 、^)的作用范围
如(my|your)baby,如果没有”()”,|将匹配的是要么是my,要么是yourbaby,有了小括号,匹配的就是mybaby或yourbaby。
进行分组,便于反向引用
9.反向引用
反向引用,就是依靠子表达式的”记忆”功能,匹配连续出现的字串或是字符。
10.模式修饰符
模式修饰符的作用是设定模式,也就是正则表达式如何解释。php中主要模式如下表:
修饰符 | 说明 |
---|---|
i | 忽略大小写 |
m | 多文本模式 |
s | 单航文本模式 |
x | 忽略空白字符 |
三、PHP中正则的应用
php中使用正则表达式的方法:
注: php中使用正则匹配时,需要在前后添加‘/’ ,如: “/[/w]/”
1、preg_match()
执行匹配正则表达式
function preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] ) : int
函数参数:
- pattern :要搜索的模式,正则表达式
- subject :字符串
- matches
可选
:如果提供了参数matches,它将被填充为搜索结果。 $matches[0]将包含完整模式匹配到的文本, $matches[1] 将包含第一个捕获子组匹配到的文本,以此类推(见代码示例2) - flages
可选
: 特殊选项,可以被设置为PREG_OFFSET_CAPTURE
或PREG_UNMATCHED_AS_NULL
- offset
可选
:通常,搜索从目标字符串的开始位置开始。可选参数 offset 用于 指定从目标字符串的某个位置开始搜索(单位是字节)。
返回值:
preg_match()返回 pattern 的匹配次数。 它的值将是0次(不匹配)或1次,因为preg_match()在第一次匹配后 将会停止搜索。preg_match_all()不同于此,它会一直搜索subject 直到到达结尾。 如果发生错误preg_match()返回 FALSE。
代码示例1:
<?php
//仅有a、b构成的字符串
$sRegex1 = '/^[a|b]+$/';
var_dump(preg_match($sRegex1 , 'abaabba'));
var_dump(preg_match($sRegex1 , 'abaabbac'));
//匹配a、b组成的字符串开头
$sRegex1 = '/^[a|b]+/';
var_dump(preg_match($sRegex1 , 'abaabbac'));
结果:
int(1)
int(0)
int(1)
代码示例2:
<?php
$sRegex1 = '/^[a|b]+/';
$sStr = 'abbdjcab';
var_dump(preg_match($sRegex1 , $sStr , $m));
var_dump($m);
结果:
int(1)
array(1) {
[0] => string(3) “abb”
}
2、preg_match_all()
执行一个全局正则表达式匹配
function preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] ) : int
函数参数:
- pattern :要搜索的模式,正则表达式
- subject :字符串
- matches
可选
:如果提供了参数matches,它将被填充为搜索结果。 $matches[0]将包含完整模式匹配到的文本, $matches[1] 将包含第一个捕获子组匹配到的文本,以此类推(见代码示例2) - flages
可选
: 特殊选项,可以被设置为PREG_OFFSET_CAPTURE
或PREG_UNMATCHED_AS_NULL
- offset
可选
:通常,搜索从目标字符串的开始位置开始。可选参数 offset 用于 指定从目标字符串的某个位置开始搜索(单位是字节)。
返回值:
返回完整匹配次数(可能是0),或者如果发生错误返回FALSE。
四、特殊用法
1、精确匹配
同时包括^和$的匹配视为精确匹配,结果只能为1和false
2、匹配中文
匹配中文、数字、字母且可以包含空格
^/[\x{4E00}-\x{9FA5}|\x{FF08}|\x{FF09}|\x{0028}|\x{0029}|\w]{2,30}(\s?[\x{4E00}-\x{9FA5}|\x{FF08}|\x{FF09}|\x{0028}|\x{0029}|\w]){0,30}/u$
1、汉字的匹配方式:\x{4E00}-\x{9FA5}
2、中文括号 (
- \x{FF08} )
- \x{FF09}
3、使用unicode方式匹配,最后要加u