正则表达式
2021-08-12 07:44:10 19 举报
AI智能生成
正则表达式知识梳理
作者其他创作
大纲/内容
贪婪&非贪婪
贪婪:表示次数的连词,默认是贪婪的默认尽可能多的去匹配
非贪婪:“数量”元字符后加?(英文状态的问号) 找出长度最小且满足要求的
独占模式
“量词”元字符后加+满足要求情况下尽可能按最长去匹配
不会发生回溯,匹配不上即失败
正则分组
功能
将某部分(子表达式)看成一个整体
在后续查找和替换中华引用分组
分组编号
第几个括号就是第几个分组
非捕获分组使用(?: 正则)
括号嵌套只需要看左括号的序号
命名分组(?:<名称>正则)
分组引用
查找:查找重复出现的部分
替换:对原有内容格式进行改写
文本编辑器
sublime Text3为例
查找功能,使用正则查找后,剪切出来
替换功能
正则匹配模式
不区分大小写模式
作用:正则不区分英文字母的大小写
修饰符:(?i)
点号通配模式
作用:英文的点号可以匹配任何字符,包括换行
修饰符:(?s)
很多地方成为“单行匹配模式”,其实和多行匹配没有联系
JavaScript不支持,Ruby中的Multiline其实就是单行匹配模式
等价于[\s\S] 或[\d\D]或[\d\D]
多行模式
作用:^ 或$ 默认是匹配整个字符串的开头或结尾多行模式使得特们能匹配每行的开头或结尾
修饰符 (?m)
^ 匹配行的开始,多行模式时,可以匹配任意行开头
$ 匹配行的结束,多行模式时可以匹配任意行结束
注释模式
作用:正则可能很复杂,编写和阅读维护困难添加注释方便理解
修饰符:(?#comment)
实例:(\w+)\1(?#word repead again)
正则转义
转义字符
含义:对它后续的几个字符进行替代并解释
功能
编码无法用字母表表示的特殊数据
表示无法直接键盘录入的字符
字符串转义和正则转义
字符串转义:输入字符串到字符串文本的过程
正则转义:正则文字到正则表达式的过程
匹配反斜杠本身需要四个\
简化方式:使用原生字符串
元字符的转义
量词*或?或-或$或|等直接在前面加反斜杠
括号[]{}只需要转义开括号,但()两个都需要转义即\(\)
使用编程语言中的函数消除元字符特殊含义
python re.escape(text)
Go regexp.QuoteMeta(text)
java Pattern.quote(text)
PHP preg_quote(text)
字符组的转义
1. 脱字符在中括号中,且在第一个位置
2. 中划线在中括号中,且不在第首尾位置
3. 右括号在中括号中,且不在首位位置
4. 其他单长度的元字符一般不需要转义
Unicode正则
Unicode基础知识
有17个平面,常用的是0号平面,即BMP平面
UTF-8编码,变长存储,兼容AScii编码
Unicode与UTF-8编码的关系
Unicode中的正则
字符组中,如果处理中文,要使用Unicode编码
点号匹配,点号不能匹配Unicode字符
字符组匹配,如\w,\s,\d
Unicode属性
Unicode Categories
按功能分类,每一个字符只属于一个分类
示例:\p{p} 标点符号
Unicode Block
按码值区间划分,各区间互不相交
示例:\p{Arrows}箭头符号
Unicode Scripts
按照书写系统来划分,
示例: \p{han} 汉语
表情符号
特点
许多表情不在BMP 内码值超过了FFF .UTF-8编码时,一些表情需要4个字节
分散再BMP和各个补充平面,用正则来表示所有的表情符号非常麻烦
一些表情现在支持颜色修饰,可以在5钟色调之间进行选择。算上颜色修饰,一个表情占用8个字节空间
不建议用正则来处理,建议通过专用的库来解决
其他内容
单词边界
规范化问题
特殊单字符
. 任意字符(换行除外)
\d 任意数字 \D任意非数字
\w 任意字母数字下划线 \W 任意非数字下划线
\s 任意空白符 \S任意非空白符
空白符
\r 回车符
\n换行
\f 换页符
\t 制表符
\v 垂直制表符
\s 任意空白字符
范围
| 或
[ ...] 多选一
[a-z] 匹配A到Z任意单个元素
[^...] 取反,不能是括号中的任意单个元素
量词
* 0次到多次
+ 1次到多次
? 0到多次
{m} 出现m次
{m, } 至少出现m次
{m,n} 出现m到n次
子主题
断言
单词边界
\b 匹配单词的边界
行的开始,结束
^ 匹配行的开始 多行模式时,可以匹配任意行开头
$ 匹配行的结束 多行模式时,可以匹配任意行结尾
\A 仅匹配整个字符串的开始 不支持多行模式
\Z 仅匹配整个字符串的结束 不支持多行模式
环视
(?<=Y)X 匹配前面是Y的X
(?<!Y)X匹配前面不是Y的X
X(?=Y) 匹配后面是Y的X
X(?!Y) 匹配后面不是Y的X
正则流派
正则简史
20世纪40年代,Warren McCulloch 和Walter Pitts 提出了一种神经网络描述方法
1956年,一位数学家(Stephen Kleene)发表论文描述一种“正则集合”符号
Ken Thompson (UNIX之父) 于1968年发表了文章《正则表达式搜索算法》 编辑器qed -->grep -->(类)UNIX 系统各种工具
1968年,POSIX标准,开始进行正则标准化的尝试(POSIX流派)
1987年12月,Larry Wall 发布了Perl 语言第一版,随后正则功能大放异彩,影响越来越大
1997年有诞生了PCRE --Perl兼容正则表达式(Perl Compatible Regular Expressions
流派
POSIX流派
POSIX字符组
BRE
工具:grep, vi/vim sed
特点:花括号,圆括号要转义,不支持问号,管道符,和加号
字符组:不能使用\d 等字符组,需要使用POSIX字符组
GNU BRE
工具:GNUgrep, GNU sed
特点: 在BRE基础上,支持问号,加号和管道符
巧妙记忆:GNU BRE “花园问管家要转移”
ERE
工具: egrep,awk
特点:花括号,圆括号不用转义,支持问号,加号和管道符
字符组:不能使用\d等字符组,需要使用posix字符组
GNU ERE
工具:GNU sed-E, GNU grep -E
特点 :在ERE 基础上,支持反向引用 \1\2
巧妙记忆: GNU ERE 两个E 不需要再转义
mam命令
查看使用说明
查看工具使用的正则流派
PCRE流派
工具:grep -P, sed -P, 目前主流的编程语言
特点:\d\w\s式它显著的标识
常见的语言都基于PCRE流派的
收藏
0 条评论
下一页