正则表达式
元字符
元字符 | 说明 |
---|---|
* | 重复零次或多次 |
+ | 重复一次或多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或多次 |
{n,m} | 重复n到m次 |
. | 匹配除换行符以外的任意一个字符 |
\w | 匹配一个字母、数字、下划线 |
\W | 匹配一个除字母、数字、下划线以外的字符 |
\s | 匹配一个任意的空白符 |
\S | 匹配一个不是空白符的任意字符 |
\d | 匹配一个数字 |
\D | 匹配一个非数字 |
\b | 匹配一个单词的开始或结束 |
\B | 匹配一个单词的非开始或非结束 |
^ | 匹配一个字符串的开始 |
$ | 匹配一个字符串的结束 |
[] | [0-9],[a-z],[0-9a-z],[aeiou],[^aeiou] |
| | 或 |
(exp) | 分组 |
(?<name>exp) | 分组命名;若不命名,默认为索引命名 |
(?:exp) | 匹配表达式,但不捕获结果 |
\1或\k<name> | 反向引用 |
贪婪懒惰
- 贪婪:匹配尽可能长的字符串。默认
- 懒惰(非贪婪):匹配尽可能短的字符串。在重复元字符后面加?可变为非贪婪
贪婪
a.*b
aabab
匹配结果
aabab
----------
懒惰
a.*?b
aabab
匹配结果
aab
ab
零宽断言
一个条件,但不会被实际匹配
(?=exp)
正向先行断言(?<=exp)
正向后行断言(?!exp)
负向先行断言(?<!exp)
负向后行断言
正向先行断言
\b\w+(?=ing\b)
I'm singing while you're dancing.
匹配结果
sing
danc
-----------------------------------
正向后行断言
(?<=\bre)\w+\b
reading a book, bbading
匹配结果
ading
-----------------------------------
负向先行断言
\d{3}(?!\d)
123q
1234
123
匹配结果
123
234
123
----------------------------------
负向后行断言
(?<![a-z])\d{7}
AWD3748596dce2846582
匹配结果
3748596
递归
PHP支持(?R)
代表正则表达式本身
https://www.laruence.com/2011/09/30/2179.html
\((?R)*\)
能匹配
((()))
处理选项
选项 | 说明 |
---|---|
IgnoreCase | 匹配时不区分大小写 |
Multiline | 以换行为标志看作字符串,$匹配换行符之前的位置 |
Singleline | 使.能与每一个字符匹配,包括换行符 |
IgnorePatternWhitespace | 忽略表达式中的非转义空白并启用由#标记的注释 |
(?i)
IgnoreCase(?m)
Multiline(?s)
Singleline(?x)
IgnorePatternWhitespace
注释
(?#comment)
#comment
,需开启IgnorePatternWhitespace
PHP正则操作
https://www.php.net/manual/zh/book.pcre.php
分隔符
当使用 PCRE 函数的时候,模式需要由分隔符闭合包裹。分隔符可以是任意非字母、数字、反斜线、空白字符。
经常使用的分隔符是正斜线(/)、hash符号(#) 以及取反符号(~)
preg_match()
执行正则表达式匹配
preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] ) : int
- $pattern:模式,即正则表达式
- $subject:输入字符串
- $matches:将被填充为搜索结果。$matches[0]将包含整个模式匹配到的文本,$matches[1]将包含第一个捕获子组匹配到的文本
- $flags:
- 0:默认
- PREG_OFFSET_CAPTURE:保存偏移量。如果传递了这个标记,会改变填充到matches参数的数组,使其每个元素成为一个由第0个元素是匹配到的字符串,第1个元素是该匹配字符串在输入字符串中的偏移量
- $offset:指定从哪个位置开始搜索
返回值:返回匹配次数。它的值将是0或1或false。preg_match()在第一次匹配后将会停止搜索。如果发生错误会返回false
preg_match_all()
执行全局正则表达式匹配
preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] ) : int
- $flags:
- 不能同时使用PREG_PATTERN_ORDER和PREG_SET_ORDER
- PREG_PATTERN_ORDER:结果排序为$matches[0]保存整个模式的所有匹配, $matches[1] 保存第一个子组的所有匹配,以此类推
- PREG_SET_ORDER:结果排序为$matches[0]包含第一次匹配得到的所有匹配(包含子组),$matches[1]是包含第二次匹配到的所有匹配(包含子组)的数组,以此类推
- PREG_OFFSET_CAPTURE:保存偏移量
返回值:返回匹配次数,如果发生错误返回FALSE
preg_grep()
在数组中搜索匹配模式的元素
preg_grep ( string $pattern , array $input [, int $flags = 0 ] ) : array
- $input:输入数组
- $flags:
- 0:默认
- PREG_GREP_INVERT:函数将返回输入数组中与给定模式pattern不匹配的元素组成的数组
返回值:返回与模式匹配/不匹配的元素组成的数组,键还是原来的键
preg_replace()
替换
https://www.php.net/manual/zh/function.preg-replace.php
preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] ) : mixed
- $pattern:要搜索的模式。可以是一个字符串或数组
- $subject:输入字符串或数组
- $replacement:用于替换的字符串或数组
- $limit:每个模式在每个subject上进行替换的最大次数。默认是 -1(无限)
- $count:如果指定,将会被填充为完成的替换次数
返回值:返回替换后的字符串或数组,发生错误返回null
preg_filter()
https://www.php.net/manual/zh/function.preg-filter.php
只返回匹配成功的结果,其余同preg_replace()
preg_split()
通过一个正则表达式分隔字符串
preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] ) : array
- $limit:如果指定,将限制分隔得到的子串最多只有limit个,返回的最后一个子串将包含所有剩余部分。limit值为-1, 0或null时都代表"不限制"
- $flags:
- PREG_SPLIT_NO_EMPTY:如果这个标记被设置,函数将仅返回分隔后的非空部分
- PREG_SPLIT_DELIM_CAPTURE:如果设置了此标志,模式中的括号表达式也将被捕获并返回
- PREG_SPLIT_OFFSET_CAPTURE:附加偏移量
返回值:返回分隔后得到的子串组成的数组,或者在失败时返回FALSE