正则表达式
1.正则表达式入门简介、使用…
正则表达式的使用场景
- 批量提取/替换有规律的字符串
- 在各种高级的文本编辑器中的使用
- 在各类办公软件( Office等)中使用
- 各开发语言中iR ( C#/ Java / JS / Perl/ PHP 等等)
- 用户输入的合法性验证(IP地址,特殊的订单号要求等)
- 模板引擎的标签库开发
- 网络爬虫(抓取机器人)的开发
- 批量的文本高效处理
正则表达式的测试工具
-
推荐RegexBuddy
http://www.regexbuddy.com
-
RegExBuilder
http://www.redfernplace.com/software-projects/regex-builder/
-
在线测试工具
http://tool.chinaz.com/regex/
2.初识正则表达式以及元字符概念
Agenda
- Windows系统命令行中存在的最简单的正则表达式
- 元字符概念以及元字符的反义
- 转义的概念以及正则表达式中的使用正
- 则表达式语言中的注释方法
Windows系统命令行中存在的最简单的正则表达式
- *任意长度的字符串
- ?长度为1的任意字符串
元字符概念
使用操作
元字符的反义
字符转义
- 如果就是想要匹配.或者?这样的字符呢?
- 转义字符\
\. \* \?
正则表达式中的注释
-
2[0-41\d(?#200-249)250-5[01]?\d\d?(?#0-199).
-
启用“忽略模式里的空白符”选项
(?<= #断言要匹配的文本的前缀
<(w+)> #查找尖括号括起来的字母或数字(即HTML/XML标签)
) #前缀结束
.* #匹配任意文本
(?= #断言要匹配的文本的后缀
<V\1> #查找尖括号括起来的内容:前面是一个"/" ,后面是先前捕获的标签
) #后缀结束
3.正则表达式中的重复
Agenda
- 分支条件
- 正则表达式中的几种重复模式
- 重点解释重复的几种模式的区别
- 讲解正则表达式中重复的使用场景
正则表达式中的几种重复模式
分支条件
- 用|不同的规则分隔开
- 从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的件了
- 0\d{2}-\d{8}|0\d{3}-\d{7}
字符类
-
[0-9] ==\d
-
[a-z0-9A-Z_] ==\w
-
[&?.]
-
[aeiou]
-
\(?0\d{2}[)-}?\d{8}
4.正则表达式中的分组概念&贪婪与懒情
Agenda
- 讲解正则表达式中重要的一个概念:命组
- 分组的概念
- 分组的命名模式分
- 组的用途
- 正则表达式中的贪婪和懒惰
分组
-
将子表达式进行做成子集
-
使()进分组
-
方便对match的字符串进行划分
(\d{1,3}\.){3}\d{1,3}
-
分组的命名: (? exp)
-
(?:exp) 匹配exp不捕描获匹配的文本,也不给此分组分配组号
贪婪与懒情
-
贪婪(尽可能多)
a.*b (aabab) -> aabab
-
懒惰(尽可能少)
匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复a.*?b (aabab)-> aab
处理选项(RegexOptions)
5.正则表达式高阶讲解
Agenda
- 反向引用
- 零宽断言的概念以及使用场景
- 负向零宽断言的概念以及使用场景
- 冗长的平衡组和递归匹配
反向引用
- 要匹配taobao taobao , home home这样的情况如果处理?
- \b(\w+)\b\s+\1\b
- \b(? \w+)\b\s+\k\b这是命名后的另一种写法
零宽断言
-
?=exp零宽度正预测先行断言,自身出现的位置的后面能匹配表达式exp
-
\b\w+(?=ing\b)
-
I’m
sing
ing while you’redanc
ing. -
?<=exp零宽度正回顾后发断言,自身出现的位置的前面能匹配表达式exp
(?<=\bre)w+\b
re
ading
a book
负向零宽断言
-
查找这样的单词-它里面出现了字母q,但是q后面跟的不是字母u
\b\w*q[^uJw*\b
- 上面的表达式有没有问题呢?使用零宽度负预测先行断言
\b\w*q(?!u)\w*\b
并不消费任何字符
-
\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字
-
\b((?!abc)w)+\b匹配不包含连续字符串abc的单词
-
那么同样的,还有零宽度负回顾后发断言
- (? <![a-z)d{7)匹配前面不是小写字母的七位数字
- (?<=<(w+)>).*(?=)
不包括前缀和后缀本身
平衡组/递归匹配
- 如何把xx <aa aa> yy这样的字符串里,最长的配对的尖括号内的内容捕获出来?
- (?‘group’)把捕获的内容命名为group,并压入堆栈(Stack)
- (?"-group’)从堆栈上弹出最后压入堆栈的名为group的捕获内容,如果堆栈本来为空,则本分组的匹配失败
- (?(group)yesIno)如果堆栈上存在以名为group的捕获内容的话,继续匹Eyes部分的表达式,否则继续匹配no部分
- (?!)零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败
总结
-
多进行实际的实例
-
想学好多练习
-
学好后一劳永逸,威力无穷