把美丽作为一种人生态度,自信、自律,保持初心,感知美好,让美丽由内而外的盛放!
正则表达式是必备技能之一
正则表达式难学在于没有吧那些例子吃透,
总结:
- win下换行符可能是 回车换行符 \r\n; CR|LF
- 一旦扫描绝不回头;不会重叠匹配123 \d\d -12;
正则表达式 Regular Expression
正则表达式 Regular Expression,缩写regex、regexp、RE等;
当今计算机主要是处理文本和数据(至少目前是这样的),特别是在Web兴起之后,开发任务中的有一大堆都是对字符串的处理.
1.什么是正则表达式
正则表达式,就是一种描述字符串结构模式的形式化表达方式.正则表达式它简单,优美,功能强大,妙用无穷.
正则表达式主要是用来处理文本,或者准确说是处理对象序列,对于很多实际工作来说,可以成百倍的提高开发效率和程序质量.
有的同学也许会说,正则表达式不是很复杂吗,就正则本身来说,它的规则并不复杂,但是组合起来就复杂了,不然也不会威力无穷啊,所以学的话最好从本质入手,才能真正掌握正则的奥秘.
2.正则表达式分类
- BRE:基本正则表达式,grep、sed、vi 等软件支持,vim 有拓展;
- ERE:扩展正则表达式,egrep(grep -E)、sed -r 等;
- PCRE:几乎所有高级语言都是PCRE的变种,python从106开始使用SRE正则引擎,可以认为是PCRE的子集,见模块re;
3.正则表达式进行匹配的流程
依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。
4. 基本语法
元字符 matacharacter(一个字符)
对于PCRE的多种变种,元字符在每一种 编程语言中 都是基本一致的,
\b是一个例外,指的是单词的边界;
元字符 每次匹配一个字符;元字符可以组合 \d\d\d
一旦扫描绝不回头;不会重叠匹配123 \d\d -12;
代码 | 说明 | 举例 |
---|---|---|
. | 匹配除换行符外任意一个字符 | . win下换行符可能是 回车换行符 \r\n |
[abc] | 字符集合,只能表示一个字符位置。匹配所包含的任意一个字符 | [abc]匹配plain中的'a' |
[^abc] | 字符集合,只能表示一个字符位置。匹配除去集合内字符的任意一个字符 | [^abc]可以匹配plain中的'p'、'l'、'i'或者'n' |
[a-z] | 字符范围,也是个集合,表示一个字符位置,匹配所包含的任意一个字符 | 常用[A-Z][0-9] |
[^a-z] | 字符范围,也是个集合,表示一个字符位置,匹配除去集合内字符的任意一个字符 | |
\b | 匹配单词的边界 | \bb 在文本中找到单词中b开头的b字符 |
\B | 不匹配单词的边界 | t\B 包含t的单词但是不以t结尾的t字符,例如write \Bb不以b开头的含有b的单词,例如able |
\d | [0-9]匹配一位数字 | \d |
\D | [^0-9]匹配一位非数字 | |
\s | 匹配1位任何空白字符,包括制表符、换行符、空格 如 [\t\n\r\f\v] | |
\S | 匹配1位非空白字符 | |
\w | 匹配[a-zA-Z0-9_]任何大小写字母, 数字和 包含中文的字; 不匹配符号,。. | |
\W | 匹配\w之外的字符 (匹配 符号,空格、换行符、回车符) | |
[...] | 用来表示一组字符,单独列出,比如[amk]匹配a、m或k | |
[^...] | 不在[]中的字符,比如[^abc]匹配除了a、b、c之外的字符 | |
\Z | 匹配字符串结尾,如果存在换行,只匹配到换行前的结束字符串 | |
\z | 匹配字符串结尾,如果存在换行,同时还会匹配换行符 | |
\G | 匹配最后匹配完成的位置 | |
\n | 匹配一个换行符 | |
\t | 匹配一个制表符 |
字符集合[]
[1111111] [1]
[abbbbbbbb] [ad]
[0-2] [0]、[1]、[2]
转义
凡是在正则表达式中他有特殊意义的符号,如果想使用它的本意,请使用\转义
反斜杠自身吗,得使用\\
重复
前面重复多少次的问题;
代码 | 说明 | 举例 |
---|---|---|
* | 表示前面的正则表达式会重复0次或多次 | e\w* 单词中e后面可以有非空白字符 |
+ | 表示前面的正则表达式重复至少1次 | e\w+ 单词中e后面至少有一个非空白字符 |
? | 表示前面的正则表达式会重复0次或1次 | e\w? 单词中e后面至多有一个非空白字符 |
{n} | 重复固定的n次 | e\w{1} 单词中e后面只能有一个非空白字符 |
{n,} | 重复至少n次 | e\w{1,} 等价 e\w+、e\w{0,} 等价 e\w*、e\w{0,1} 等价 e\w? |
{n,m} | 重复n到m次 | e\w{1,10} 单词中e后面至少1个,至多10个非空白字符 |
练习:
1. 匹配手机号码:字符为"手机号码13851888188。"
1[0-9]{10} 1\d{10}
以13开头的: (13|17)\d{9}
2. 匹配中国座机:字符串为"号码为025-83105736、0543-5467328。"
\d{3,4}-\d{7,8}