《JavaScript正则表达式》读书笔记

本文只是干货总结,具体请看原书《JavaScript Regular Expressions(PACKT,2015)》。

原书共5章
第一章:开始使用正则表达式
第二章:基础
第三章:特殊字符
第四章:正则实践
第五章:Node.js和正则
附录:正则速查表

第一章

JS中正则相关方法以及测试工具
1.创建正则的两种方式:构造函数和字面量。
javascript 代码

2.使用修饰符
i,忽略大小写
g,全局匹配
m,多行匹配
可以如下使用:
javascript 代码

3.使用RegExp#test方法
判断正则是否匹配一个字符串:
javascript 代码

4.使用RegExp#exec方法
获取匹配的相关信息:
javascript 代码

5.使用String#replace方法
字符串替换方法。
比如替换第一个foo为qux:
javascript 代码

替换所有的foo为qux:
javascript 代码

6.使用String#search方法
获取第一个匹配的下标:
javascript 代码

7.使用String#match方法
获取匹配的相关信息(注意有没有g修饰符,返回的格式是不一样的):
javascript 代码

测试工具如下:
html 代码

第二章

通常在正则中,精确匹配是非常少的情形。
比如/hello/,用来匹配字串中的hello子串。
通常的是模糊匹配。虽是“模糊”,但通常都有约束的存在。
所谓“约束”,也就是规则,在有规则下的模糊,才有意义。
本章将讨论两种常见的模糊,足以覆盖正则中80%的情形。
1.在纵向尺度上的模糊,一个字符可以是数字、字母等,而不是某一个具体的字符。
2.在横向尺度上的模糊,一个字符出现的次数可以定制,不是只是一次。
实现前者需要使用字符组,而要实现后者需要使用量词。

1.通配符匹配
比如要匹配这样一个序列,先是1,然后某个字符,再是3。也就是像123,1b3,1 3,133等等这样的字符。针对这种情形我们可以使用.来匹配。

《JavaScript正则表达式》读书笔记
代码如下:
javascript 代码

2.匹配数字
通配符不是唯一的模糊匹配。例如前面的例子我们可以要求1和3之间的字符是数字。我们可以使用\d匹配符。

《JavaScript正则表达式》读书笔记
代码如下:
javascript 代码

3.匹配字母数字
此时我们要求1和3直接的字符是字母或数字。此时可以用单词匹配符\w。
“单词”具体的含义是数字0-9、小写字母a-z、大写字母A-Z以及下划线_。

《JavaScript正则表达式》读书笔记
代码如下:
javascript 代码

4.\D和\W
\D是\d的反义版本,\D表示此字符是任何字符,但不是数字。即0-9之外的任意一个字符。\W与\w也是类似的关系。

5.范围表示法
有时,要匹配的东西,不像\w那么多种可能。比如要找bicycle中所有的a、b、c字母,正则可以用/[abc]/g,其中[abc]匹配一个字符,此字符可以是abc中的任何一个。

《JavaScript正则表达式》读书笔记
代码如下:
javascript 代码

[abc]只是三个字母倒好说,但是26个字母呢?不能一一写下吧。还好我们有范围表示法,例如[a-z]表示所有小写字母。可以举个小场景。一堆长度为3个字母的英文名字,要判断格式是否正确。即首字母大写,其余俩字母小写,可以使用正则/[A-Z][a-z][a-z]/g:

《JavaScript正则表达式》读书笔记
代码如下:
javascript 代码

9.匹配出现至少一次
用+表示出现的次数至少一次。比如匹配英文名字,首字母大写,至少两个字母,可以使用/[A-Z][a-z]+/g:

《JavaScript正则表达式》读书笔记
代码如下:
javascript 代码

10.匹配出现0次或者1次
用?表示出现的次数0次或者一次。比如匹配苹果的单复数,可以使用/apples?/gi:

《JavaScript正则表达式》读书笔记
代码如下:
javascript 代码

11.匹配出现0次或者任意次
表示出现的次数0次或者任意次。比如查找日志中的update单词,其后可能有感叹号,也可能没有感叹号,甚至可能有多个,如updata!!!!!!!!,可以使用正则/update!/g:

《JavaScript正则表达式》读书笔记
代码如下:
javascript 代码

12.匹配出现n次
有时,你需要自定定义次数。比如匹配电话号码123-4567,你可能会把正则写成/\d\d\d-\d\d\d\d/,其实改写成/\d{3}-\d{4}/,这样可读性比较高。{n}表示出现n次。

13.匹配至少出现n次
{n,}表示至少出现n次。例如你希望密码的长度最小为6,可以用/\w{6,}/g:

《JavaScript正则表达式》读书笔记
代码如下:
javascript 代码

14.匹配出现n到m次
{n,m}表示出现n到m次。比如一般评论都是15到140字。可以用/.{15,140}/。

15.匹配分支
有时匹配规则并不是一个字符多选一,而是另外一种多选一情形。比如匹配yes和no。可以按照之前的思路,可能会把正则写成/[yn][eo]s?/g。虽然匹配了yes和no,但也匹配了其他情形,比如nos。

《JavaScript正则表达式》读书笔记
代码如下:
javascript 代码

显然上面的结果不是我们想要的。此时需要使用分支结构,使用管道符“|”,如/yes|no/g,下面我们会看到也会匹配nos中的no,下一章会解决该问题。

《JavaScript正则表达式》读书笔记
代码如下:
javascript 代码

16.第二章最后一个例子
我们要匹配电话号码,它支持如下三种格式:
123-123-1234
(123)-123-1234
1231231234
其中括号和连字符是可选的。这里只要求写出一个正则能匹配上述三种格式即可。
写出的正则是/(?\d{3})?-?\d{3}-?\d{4}/g,其中括号是特殊字符,需要转义。

《JavaScript正则表达式》读书笔记
代码如下:
javascript 代码

第三章

紧接第二章,继续讲解正则表达式基础。内容包括位置、非贪婪量词和分组。
正则表达式不仅可以匹配字符,也可以匹配看不见的东西,即字符之间的位置。

1.匹配字符串的开头和结尾
使用脱字符^匹配开头,使用美元符号$匹配结尾。二者都是位置。
比如用/^word|word$/g,来匹配输入的开头的word和结尾的word。

《JavaScript正则表达式》读书笔记
代码如下:
javascript 代码

在修饰符为m的情形下,即多行匹配时,二者也相应匹配行的开头和结尾。比如:
javascript 代码

2.匹配单词的边界
使用\b来匹配单词的边界,即\w和\W之间的位置。有时我们只想匹配can这个单词,比如使用/can/g,但结果也会匹配到candy里的can。此时可以\b来做,比如/\bcan\b/g:

《JavaScript正则表达式》读书笔记
代码如下:
javascript 代码

《JavaScript正则表达式》读书笔记
\b是个位置,你看不到的东西。比如上例子中,之所以不匹配candy中的can,原理是这样的。我们需要看can前后的两个位置,之前的位置是匹配的,其中can的前面一个字符是空格,空格是\W,而c是\w,因此二者之间是位置是\b。而之后的位置就不是\b了,因为n和d都是\w。
另外要说明一点是,\b与空格是不同的。空格是字符,可以" "来匹配,可以用\s来匹配。\s是空白符包括空格,制表符等,用字符组的形式来表示,[ \t\v\n\r\f]。其反义形式是\S。

3.匹配非单词边界
\b也有反义版本\B,也表示一个位置,但是此位置不是\b。比如上例中,要匹配candy中can,但不匹配can这个单词,可以用/can\B/g:

《JavaScript正则表达式》读书笔记
代码如下:
javascript 代码

4.非贪婪量词
之前学习了量词,比如/d{1,4}/。其匹配是贪婪的,它会尽可能多的匹配。比如对字符123456,它会匹配到1234,对123,它会匹配123。能否尽可能少的匹配呢?可以,只需要在量词后面加上?即可。这是两个极端,尽可能少的匹配叫非贪婪匹配。

《JavaScript正则表达式》读书笔记
代码如下:
javascript 代码

有时贪婪匹配不是你想要的结果,比如如下的html:
<div class="myclass" id="mydiv">
some contents
</div>
你想匹配class部分,你可能会写成/class="."/,但匹配的结果是class="myclass" id="mydiv",因为通配符.是匹配双引号的,而是贪婪的,不会遇到第一个双引号就会停止。此时正则需要改成/class=".*?"/:

《JavaScript正则表达式》读书笔记
代码如下:
javascript 代码

待续

第四章

待续

第五章

待续

附录

待续

评论 ( 0 )
最新评论
暂无评论

赶紧努力消灭 0 回复