前言

仅以此作为本人学习过程的记录

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等,具体做法是自己配制出某种规则然后用于匹配字符串。

正文

界定符

正则表达式界定符://(最常用)、{}||## 等等,比如

pattern='/[0-9]/';   //最常用pattern='{[0-9]}';

元字符

| 匹配两个或者多个分支选择(类似于或者),等同于+
[] 匹配方括号中的任意一个原子
[^] 匹配除方括号中的原子之外的任意字符
. 匹配除换行符之外的任意字符

/[a-z]/    //匹配a~z之间的字母
/[^a-t]/    //匹配除a~t外的字符
/[a-z|0-9]/  //匹配a~z或者0~9之间的字符,相当于/[a-z0-9]/或者/[a-z+0-9]/
/./         //匹配任意一个字符

\d 匹配任意一个十进制数字,即{0-9]
\D 匹配任意一个非十进制数字[^0-9] 相当于[^\d]
\s 匹配一个不可见的原子,即[\f\n\r\t\v]
\S 匹配一个可见的原子,即[^\f\n\r\t\v],相当于[^\s]
\w 匹配任意一个数字、字母或下划线,即[0-9a-zA-Z_]

\W 匹配任意一个非数字、字母或下划线,[^0-9a-zA-Z_],相当于[^\w]

+字母型有规律:+小写字母表示的意思和+大写字母表示的意思相反

量词

{n} 表示其前面的原子刚好出现了n次
[n] 表示其前面的原子最少出现n次
{n,m} 最少出现n次,最多出现m次
* 匹配0次、一次或者多次,即{0,}
+ 匹配一次或多次,即{1,}
? 匹配0或1次,即{0,1}

边界控制

^ 匹配字符串开始的标志
$ 匹配字符串结束的标志

^he  //匹配he开头的字符串,对1he,jkhe等不匹配
$he  //匹配he结束的字符串,对hea,ahek等不匹配

修正模式

修正模式在界定符后面添加

贪婪匹配

匹配结果存在歧义时取其长(默认)

懒惰匹配

匹配结果存在歧义时取其短,只需在正则表达式的后面’/’加上’U’,例如’/[0-9]/U’;
例子:

Copy
subject = "test__123123123";
preg_match('/test.+123/',subject, matches); //贪婪模式  
var_dump(matches);
preg_match('/test.+123/U', subject,matches); //懒惰模式
var_dump($matches);
常见的修正模式:

U 懒惰匹配
i 忽略英文字母的大小写
x 忽略正则表达式的空白符
s 让元字符’.’ 匹配包括换行符在内的所有字符

常用函数

preg_match

执行匹配正则表达式

preg_match ( string pattern , stringsubject [, array &matches [, intflags = 0 [, int $offset = 0 ]]] ) : int

pattern: 要搜索的模式,字符串类型。
subject:输入字符串。
match: 如果提供了参数matches,它将被填充为搜索结果,数据结构为一维数组。
flags: 可以设置为PREG_OFFSET_CAPTURE,使用搜索结果的第0个元素为匹配的字符串,第1个元素为对应的偏移量(位置)
offset: 搜索从目标字符串的起始位置开始匹配
返回值:匹配次数

类似函数preg_match_all,参数与preg_match一致
区别:

preg_match:只匹配一次,搜索结构match的数据结果为一维数组
preg_match_all:匹配全部,搜索结果match的数据结构为二维数组。

preg_replace

执行一个正则表达式搜索和替换,返回值为替换后的字符串

preg_replace ( mixed pattern , mixedreplacement , mixed subject [, intlimit = -1 [, int &$count ]] ) : mixed

pattern:要搜索的模式。可以是一个字符串或字符串数组。
replacement:用于替换的字符串或字符串数组
subject:要进行搜索和替换的字符串或字符串数组。
limit:替换的最大次数。默认是 -1(无限)。
count:替换次数。

类似函数preg_filter,参数与preg_replace一致
区别(使用数组进行匹配的时候才看得出区别):
preg_replace:不管是否有替换,返回全部结果
preg_filter:只返回匹配的结果。

preg_split

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

preg_split ( string pattern , stringsubject [, int limit = -1 [, intflags = 0 ]] ) : array

pattrn:用于搜索的模式,字符串形式。
subject:输入字符串
limit:将限制分隔得到的子串最多只有limit个,返回的最后一个 子串将包含所有剩余部分。
flags:有以下标记的组合:
— 1. PREG_SPLIT_NO_EMPTY: 返回分隔后的非空部分。
— 2. PREG_SPLIT_DELIM_CAPTURE: 用分隔符'()’括号把匹配的捕获并返回。
— 3. PREG_SPLIT_OFFSET_CAPTURE: 匹配返回时将会附加字符串偏移量

PREG_SPLIT_DELIM_CAPTURE

这个参数可能比较难明白,举个例子看看:

subject = "1a23b";a = preg_split('/[\d]/', subject, -1, PREG_SPLIT_NO_EMPTY);  
var_dump(a);  
a = preg_split('/([\d])/',subject, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); 
var_dump($a);  

输出如下:

array (size=2)
0 => string 'a' (length=1)
1 => string 'b' (length=1)
array (size=5)
0 => string '1' (length=1)
1 => string 'a' (length=1)
2 => string '2' (length=1)
3 => string '3' (length=1)
4 => string 'b' (length=1)

preg_grep

返回匹配模式的数组条目

preg_grep ( string pattern , arrayinput [, int $flags = 0 ] ) : array

$pattern:要搜索的模式,字符串形式
$input:输入数组
flags:如果不设置则返回匹配的数目,设置PREG_GREP_INVERT则返回不匹配的数目。

preg_quote

转义正则表达式字符,返回为转义后的字符串

preg_quote ( string str [, stringdelimiter = NULL ] ) : string

str:输入字符串
delimiter:需要转义的字符串

结尾

参考来自:https://www.cnblogs.com/Johnson-lin/p/10875388.html#3499884773

说点什么
支持Markdown语法
好耶,沙发还空着ヾ(≧▽≦*)o
Loading...