前言

最近又把正则拿出来看。这本书还是要经常复习一下的。书里有很多示例,讲解的也很透彻,动手跟着复习一遍收获很多。
实验工具你可以到这里下载,免费版,匹配次数也没有限制: http://www.regexlab.com/zh/mtracer/ 还有一个选择是sublime text,免费版即可,搜索时,打开搜索框里面的正则按钮即可(一个.*类似的图标)。

另外,再提供个可视化工具,用图形来帮助你理解正则的逻辑: https://jex.im/regulex/#!flags=&re=%5E(a%7Cb)*%3F%24

1 正则的用途

正则表达式简称正则。我们可以用它来匹配字符串。搜索字符串,例如搜索car,Car,CAR。 当然也可以用来做替换。例如将http://www.ituring.com.cn 替换为<a href="http://www.ituring.com.cn" >图灵科技</a>

2 匹配单个字符

我们用英文的句点来匹配单个字符。 请您来想一想:.a.能够匹配到什么?如果我们要匹配最后三行,应该怎么写正则表达式呢?

示例2-1:

sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
.a.\.xls试试能匹配到什么?\.指什么,你知道吗?

3 匹配一组字符

请问如果要在下面文本中,我只想匹配n和s开头的文本,该如何做?

示例3-1:

sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
ca1.xls
[ns]a.\.xls怎么样呢?

我们再加一组例子,你再看看[ns]a.\.xls匹配的对不对。

示例3-2:

sales1.xls  
orders3.xls  
sales2.xls  
sales3.xls  
apac1.xls  
europe2.xls  
na1.xls  
na2.xls  
sa1.xls  
ca1.xls  
usa1.xls  

再试试[ns]a[0-9]\.xls呢?
enter image description here
小练习,你来试一下,要匹配下面的十六进制颜色代码,该怎么写呢?

示例3-3:

body {
background-color: #fefbd8; }
h1 {
background-color: #0000ff;}
div {
background-color: #d0f4e6;}
span {
background-color: #f08970;}

取反^的示例,下面数据中,如何取出sam.xls:

示例3-4:

orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls

4 元字符

元字符包括- \[]。当然还有很多。先介绍这些。

示例4-1:

<body>  
<h1>Welcome to my Homepage</h1>  
Content is divided into two sections:<br/>  
<h2>SQL</h2>  
Information about SQL.  
<h2>RegEx</h2>  
Information about Regular Expressions.  
<h2>This is not valid HTML</h3>  
</body>  `

enter image description here
看看图片里面和你做法一样吗?

5 重复匹配

5.1 *?+来匹配

这一节也学了很多次,用的时候还是混淆。今天编个口诀记一下。零星(重复次数大于等于0次的用*),一加手机(重复次数≥1的用加号),自问(独自一个人的用问号)。
怎么样,你记住了吗。

看看如何匹配下列电子邮件地址,一边做一边想一想:

示例5-1 匹配邮件

Send personal email to ben@forta.com. For questions about a book use support@forta.com. Feel free to send unsolicited email to spam@forta.com (wouldn't it be nice if it were that simple, huh?).

\w+@\w+\.\w+可以吗?

示例5-2 匹配邮件

y@ituring.com.cn
yf@itruing.com.cn
yangf@ituring.com.cn

\w+@\w+\.\w+还可以吗?该怎么改进?

示例5-3 匹配邮件地址

Send personal email to ben@forta.com or ben.forta@forta.com. For questions about a book use support@forta.com. If your message is urgent try ben@urgent.forta.com. Feel free to send unsolicited email to spam@forta.com (wouldn't it be nice if it were that simple, huh?).
[\w.]+@[\w.]+\.\w+可以吗?

示例5-4 匹配网址

The URL is http://www.forta.com/, to connect
securely use https://www.forta.com/ instead.
https?:\/\/[\w.\/]+ 可以吗?

示例5-5 匹配回车换行符

"101","Ben","Forta"
"102","Jim","James"

"103","Roberta","Robertson"
"104","Bob","Bobson"

5.2 {n,m}来重复

* + ?可以来表示重复次数,但是它们有一个明显的缺陷。就是无法精确表达重复次数。
正则表达式中我们用{m,n}来实现这个。花括号也是元字符。 在这个表达式里面,你可以只有m,{m}那就是m次;也可以m和n都有,就是大于等于m,小于等于n次,也可以只有m和逗号,就是m次起步,上不封顶。

示例5-6 匹配RGB颜色的16进制代码

body {
background-color: #fefbd8;
} h1 {
background-color: #0000ff;
} div {
background-color: #d0f4e6;
} span {
background-color: #f08970;
}
#[A-Fa-f0-9]{6} 或者[:xdigit:]{6} [:xdigit:]是POSIX表示的正则,可以参考这里

示例5-7 匹配各种日期

4/8/17
10-6-2018
2/2/2
01-01-01

\d{1,2}[-\/]\d{1,2}[-\/]\d{2,4}试一下。 请注意,这个正则并没有验证日期的真实性。只是匹配了格式。

示例5-8 匹配美元金额

1001: $496.80
1002: $1290.69
1003: $26.43
1004: $613.42
1005: $7.61
1006: $414.90
1007: $25.00

\$\d{3,}\.\d或者\d+: \$\d{3,}\.\d 注意美元符也是元字符。需要转义。

5.3 防止过度匹配

你对比下*和{n,} +与?的区别。

示例5-9匹配html标记

This offer is not available to customers
living in <b>AK</b> and <b>HI</b>.

请试一下<b>.*?</b>,为什么这里用?问号呢,就是将贪婪模式转换为懒惰模式。
变为?,+变为+?,{n,}变为 {n,}?就将贪婪模式变为了懒惰模式。

6边界匹配

所谓的边界匹配,简单说就是将cat和scattered里的cat区分出来的能力。它匹配的是边界位置。

6.1单词边界

示例6-1

The cat scattered his food all over the room.
这个可以用\b,\b匹配的是一个位置,它位于\w能匹配到的内容(字母、数字和下划线)和\W(不构成单词的其他字符,也就是非字母、数字、下划线的字符)能匹配的东西之间。

示例6-2

The captain wore his cap and cape proudly as he sat listening to the recap of how his crew saved the men from a capsized vessel.
这次试一下,如何匹配cap开头的单词,如何匹配cap结尾的单词? Please enter the nine-digit id as it appears on your color - coded pass-key.

6.2 字符串边界

^$分别用来匹配