前言:
一直想发表一篇博文,来对正则表达式的使用进行记录,方便以后的查找,因为正则表达式的使用比较频繁,所以学会正则表达式是很必要的,所以在这里发表一篇博客做一个入门级别的介绍,希望对你们有用,有错误希望指正,互相学习,多多交流。
1. 正则表达式的概念
正则表达式的概念很简单:正则表达式就是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。
2. 正则表达式的场景
列举一些正则表达式使用的场景:
- 批量提取/替换有规律的字符串
- 在各种高级的文本编辑器中的使用
- 在各类办公软件中使用
- 各种开发语言中的使用(java/JS/golang/php等)
- 用户输入的合法性验证(IP地址、特殊的订单号要求等)
- 模板引擎的标签库开发
- 网络爬虫(抓取机器人的开发)
- 批量的文本高效处理
3. 工具推荐
在这里推荐一个学习正则表达式要用到的工具regexBuddy这个软件是收费软件,需要破解版的可以到如下链接进行[下载安装](http://www.ddooo.com/softdown/135270.htm)。
4. 初识正则表达式及元字符的认识
windows系统或者Linux系统命令行中就存在最简单的正则表达式,比如:*代表任意长度的字符串,?长度为1的任意字符串等。
4.1 元字符的概念
我们来看这个表:
元字符 | 说明 |
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
4.2 元字符反义
语法 | 说明 |
\W | 匹配任意不是字母,S数字,下划线,汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
^x | 匹配除了x以外的任意字符 |
^aeiou | 匹配除了aeiou这几个字母以外的任意字符 |
备注:要注意字符的转义:如果要想匹配点符号、问号符号这样的字符,我们需要进行转义,使用转义字符\来进行进行转义,否则将无法匹配。
上面这些符号我们可以通过regexBuddy这个软件进行测试加深映像。
5. 正则表达式相关使用
5.1 几种重复的模式
语法 | 说明 |
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
这里还有一个知识点是分支条件:
- 用 | 把不同的规则分隔开
- 从左到右地测试每个条件,如果满足了某个分支的话,就不会去管其它的条件了。
我们平常在看别人的正则表达式的时候,会看到[0-9]这种的,它等于\d。[]中括号里面放置选择的条件。注意这种写法。
5.2 正则表达式的分组
分组就是将子表达式进行做成子集,我们可以使用()进行分组,方便了对match字符串进行划分。
这里设计一个贪婪与懒惰的概念。
贪婪就是:尽可能多的重复;相反懒惰就是:尽可能少重复。
语法 | 说明 |
*? | 重复任意次,但尽可能少重复 |
+? | 重复1次或更多次,但尽可能少重复 |
?? | 重复0次或1次,但尽可能少重复 |
{n,m}? | 重复n到m次,但尽可能少重复 |
{n,}? | 重复n次以上,但尽可能少重复 |
5.3 简单demo
1. 例子1
假如我们要匹配ceshi cheshi或home home 这样重复的该如何处理呢?
答:这里就要用到分组了。我们可对单词进行分组,然后以空格作为区分,进行匹配。
2. 例子2
看如下句子:I’m singing while you’re dancing. 找出该句子中带ing的单词。
答:这里我们需要用到零宽断言的知识点,也就是?=exp零宽度正预测先行断言,自身出现的位置的后面能匹配表达式exp。
在这里也另一种零宽断言:?<=exp零宽度正回顾后发断言,自身出现的位置的前面能匹配表达式exp。
举个例:I’m reading a book。从这个句子中找出前面是re开头的单词。
6. 总结
这篇博客会变学习边更新会持续更新下去…。