正则表达式入门
介绍正则表达式的基本组成和基本语法。
在线正则检测工具:regexpal
##界定符## 正则表达式的开始和结束位置,不同语言略有差别,PHP中为"/"或"#"
##常见原子/元字符## 正则表达式中以Unicode编码表中的字符为原子 ######Tips:根据此特性,匹配已知汉字时,可以将其转换为Unicode编码进行匹配,以避免编码问题###### 这里有更详细的列表 ###.### 换行符之外的任意字符 ###\d### 任意一个十进制数字[0-9] ###\D### 和\d互逆,匹配一个非数字字符。等价于[^0-9] ###\s### 匹配任何不可见字符,包括空格、制表符、换页符等等。等价于[\f\n\r\t\v] ###\S### 和\s互逆,匹配任何可见字符 ###\w### \w匹配字母或数字或下划线或汉字等 ###\W### 和\w互逆,匹配任何非单词字符。等价于"[^A-Za-z0-9_]"
##量词## ###{n}### 前面原子恰好出现n次 ###{n,}### 最少出现n次 ###{n,m}### 最少出现n次,最多出现m次 ###### 匹配0次、1次、多次其之前的原子{0,} ###+### 匹配1次、多次{1,} ###?### 匹配0次、1次{0,1} ######Tips:根据区间长度分别为?、+ 、######
##边界控制# ###^### 代表字符串的开始 ######Tips:在[^]情况下为"非"意思###### ###$### 代表字符串结尾
##模式单元/分组## ###()### 里面为一个整体单元/小组
##条件符## ###|### 匹配多个分支选择,为"或"意思 ######Tips:使用分枝条件时,要注意各个条件的顺序,匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了###### ###[]### 匹配里面的任意一个原子 ###[^]### 匹配除里面原子之外的任意字符,^在第一位
##修正模式## 位于在界定符后,可以多种模式同时存在 ###U### 懒惰匹配,当结果存在歧义时取短 默认贪婪模式,当结果存在歧义时取长 ###i### 忽略英文字符大小写 ###x### 忽略空白 ###s### 让"."匹配包含换行符在内的所有字符 ###e### 仅捕获已被显示命名的分组
##分组##
###(exp)###
自动分配组名,同时捕获exp匹配结果
###(?
##断言## ###(?=exp)### 零宽度正预测先行断言,断言自身出现的位置的后面能匹配表达式exp 简单说就是:匹配结果的后面符合exp
//匹配以ing结尾的单词的前面部分(除了ing以外的部分)
$exp = '\b\w+(?=ing\b)';
$str = 'I'm singing while you're dancing';
$result = ['sing','danc'];
###(?<=exp)### 零宽度正回顾后发断言,断言自身出现的位置的前面能匹配表达式exp 简单说就是:匹配结果的前面符合exp
//以wh开头的单词的后半部分(除了wh以外的部分)
$exp = '(?<=\bwh)\w+\b';
$str = 'I'm singing while you're dancing';
$result = ['ile'];
###(?!exp)### 零宽度负预测先行断言,断言自身出现的位置的后面不能匹配表达式exp 简单说就是:匹配结果的后面不符合exp
//排除baidu
$exp = '\b((?!baidu)\w)+\b';
$str = 'baidu chengxiaobai';
$result = ['chengxiaobai'];
###(?
//前面不是小写字母的俩位数字
$exp = '(?
//不包含属性的简单HTML标签内里的内容
$exp = '(?<=<(\w+)>).*(?=<\/\1>)';
//(?<=<(\w+)>)指定了这样的前缀:被尖括号括起来的单词
//然后是.*(任意的字符串)
//最后是一个后缀(?=<\/\1>)
//\/是一个/的转义
//\1则是一个反向引用,引用的正是捕获的第一组,前面的(\w+)匹配的内容.如果(\w+)捕获的是div的话,\1就是div
$str = 'chengxiaobai';
$result = ['chengxiaobai'];
######Tips:结果并不包含自身。并且后发断言在JS中并不支持,所以目前在线正则测试工具都不能测试后发断言,但在.net、java等后端语言都是支持的######
##注释## ###(?#comment)### 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读
$exp = '2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)';
本作品由 程小白 创作,采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可,可自由转载、引用但需署名作者且注明文章出处。
原文地址:https://www.chengxiaobai.cn/skills/regular-expression-entry.html