正则表达式学习整理
简单字符匹配
- \b :元字符,代表单词的开始或结尾,也就是单词的分界处,它只匹配一个位置
- . :匹配除换行符以外的任意字符
- * :指定前边的内容可以连续重复使用任意次
- \d :元字符,匹配一位数字
- {} :大括号中为数字,规定大括号前面的字符重复的次数
{n}:重复n次
{n,}:重复n次或更多
{n,m}:重复的次数不能少于n次,不能多于m次
- \s :匹配任意的空白符
- \w :匹配字母或数字或下划线或汉字
- + :指定前面的内容可以重复使用1次或更多次
- ^ :匹配字符口串的开始,只匹配一个位置
- $ :匹配字符串的结束,只匹配一个位置
- \ :字符转义
- ? :指定前面的内容重复0次或1 次
- [] :字符类,指定一个字符的范围
[0-9] 匹配一位数字
[aeiou]匹配任意一个英文元间字母
分枝条件
指的是有几种规则,满足其中任意一种规则都当成匹配
用|把不同的规则分隔开
使用分枝条件时,要注意各个条件的顺序,匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再匹配其它的条件
分组
用小括号将需要的内容括起来,作为一个组进行操作
(\d{1,3}\.){3}\d{1,3}匹配一个简单的IP地址
((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) 匹配一个正确的IP地址
反义
- \W :匹配任意不是字母,数字,下划线,汉字的字符
- \S :匹配任意不是空白符的字符
- \D :匹配任意非数字的字符
- \B :匹配任意不是单词开头或结尾的位置
- [^x] :匹配除了x以外的任意字符
[^aeiou]:匹配除了aeiou五个字母以外的任意字符
后向引用
每一个分组会自动拥有一个组号,
从左向右,以分组的左括号为标志,第一个分组的组号为1,第二为2,以次类推
\1 代表分组1匹配的文本
指定组名:
语法:(?<word>\w+)或 (`word`\w)
反向引用这个分组捕获的内容
语法:\k<word>
(?:exp) :匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言
- (?=exp) :匹配后面是exp的位置
- (?<=exp) :匹配前面是exp的位置
- (?!exp) :匹配后面不是exp的位置
- (?<!exp) :匹配前面不是exp的位置
注释
语法:(?#comment)
贪婪与懒惰
当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符
懒惰限定符
- *? 重复任意次,但尽可能少重复
- +? 重复1次或多次,但尽可能少重复
- ?? 重复0次或1次,但尽可能少重复
- {n,m}? 重复n到m次,但尽可能少重复
- {n,}? 重复n次以上,但尽可能少重复
模式修正符
- i : 进行匹配时不区分大小写
- m :将模式视为多行,使用^和$表示任何一行都可以以正则表达式开始或结束
- s: 如果没有使用这个模式修正符号,元字符中的”.”默认不能表示换行符号,将字符串视为单行
- x: 表示模式中的空白忽略不计
- e: 正则表达式必须使用在preg_replace替换字符串的函数中时才可以使用
- A: 以模式字符串开头,相当于元字符^
- Z: 以模式字符串结尾,相当于元字符$
- U: 正则表达式的特点:就是比较“贪婪”,使用该模式修正符可以取消贪婪模式
应用例子:
- php中utf-8编码下用正则表达式匹配汉字的最终正确表达式:
/^[\x{4e00}-\x{9fa5}]+$/u - 匹配密码(大小写字母和数字的组合,不能包含特殊字符)
^(?=[a-zA-Z]*\d)(?=[0-9]*[a-zA-Z])[a-zA-Z0-9]{6,12}$