《正则表达式必知必会》前端笔记

177 阅读7分钟

这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战

前言

大家好哇,今天来记录一下正则表达式的读书笔记,正则表达式这个东西很玄妙,用的时候少,搜又搜不到合适的,学完不用就忘,实在有些弃之可惜,食之无味。

另外提前说明哦,这是一篇前端笔记类的文章,属于个人记录。各位高人请绕道勿喷,谢谢~

第一章 正则表达式入门

用处: 文本处理。

语言: 正则表达式语言(已内置在其他语言内)。

使用: 通过正则表达式完成字符的搜索和替换。

第二章 匹配单个字符

多个匹配结果和大小写: 用 g 表示全局搜索, i 表示匹配时不区分字母的大小写,可组合写为 g i 。

匹配任意字符: 用 . 表示任意单个字符,如a.c可以匹配aac,abc,adc等等。

如 a.c :

abc
abd
acc
acd
adc
bac

会匹配出:

abc
acc
adc

匹配特殊字符: 比如要匹配 . 则需要在字符前加(反斜杠) \ . 表示匹配 . 此时 . 不再表示匹配任意字符

如 a.\.c:

a.bc
ab.c
acc.
.acd
a.dc
ba.c

会匹配出:

ab.c

第三章 匹配一组字符

匹配指定字符集合:[abc] 会匹配a或b或c

如 [abc]a.\.c:

bqa.bc
aab.c
dacc.c
a.aad.c
da.dc
daba.c

会匹配出:

aab.c
a.aad.c

[0-9]表示[0123456789]

[a-z]表示[abcdefghigklmnopqrstuvwxyz]

[A-Z]表示[ABCDEFGHIJKLMNOPQRSTUVWXYZ]

-连字符只能在 [ ] 中才是元字符,在 [ ] 集合外,只是一个普通的字符,匹配自身

^ 取非,在 [ ] 中会匹配整个字符集合,而不是只在 ^ 后面的字符或字符区间。在字符集合的外面并位于一个模式的开头则表示匹配字符串的开头。

第四章 使用元字符

对特殊字符进行转义: 通过 \ (反斜杠) 进行转义,如:

 \.  匹配  . 
 
 \*  匹配  *
 
 \+  匹配  + 
 
 \\  匹配  \

 \[  匹配  [    \]  匹配  ] 
 
 任何元字符都可以通过前面加上 \ 的方式来转义
 
 元字符在[]内的时候也可以不转义,如[.][\.]都会匹配.

匹配空白字符:

[\b] 回退(并删除)一个字符(Backspace键)

\n 换行 

\r 回车 

\f 换页

\t 制表符(tab空格) 

\v 垂直制表符

\s 任何一个空白字符(不包含[\b],因为它比较特殊),等价[\n\r\f\t\v]

\S 任何一个非空白字符,等价[^\n\r\f\t\v]

匹配数字:

\d  匹配所有数字,等价 [0-9]

\D  匹配所有非数字,等价[^0-9]

匹配字母数字下划线:

\w  匹配所有字母数字和下划线,等价于[a-zA-Z0-9_]
 
\W  匹配所有非字母数字和下划线,等价于[^a-zA-Z0-9_]

匹配十六进制或八进制数值:

没看懂。。。摘录如下:

1,使用十六进制值
在正则表达式里,十六进制(逢161)数值要用前缀\x来给出。比如说,\x0A对应于ASCII字符10(换行符),其效果等价于\n。

2,使用八进制值
在正则表达式里,八进制(逢81)数值要用前缀\0来给出,数值本身可以是两位或三位数字。比如说,\011对应于ASCII字符9(制表符),其效果等价于\t。

注意:有不少正则表达式实现还允许使用\c前缀来指定各种控制字符。比如说:\cZ将匹配Ctrl-Z。不过,在实际工作中,必须使用这种语法的情况相当少见。

使用POSIX字符类(JavaScript不支持正则表达式里使用POSIX字符类):

什么是POSIX字符?

为了在不同国家的字符编码中保持一至,POSIX(The Portable Operating System Interface)增加了特殊的字符类,如[:alnum:]是[A-Za-z0-9]的另一个写法。
要把它们放到[]号内才能成为正则表达式,如[A-Za-z0-9]或[[:alnum:]]。在linux下的grep除fgrep外,都支持POSIX的字符类。

[:alnum:]    任何一个字母或数字(等价[a-zA-Z0-9])
[:alpha:]    任何一个字母(等价于[a-z-Z])
[:blank:]    空格或制表符(等价于[\t ])(字母t后有一个空格)
[:cntrl:]    ASCII控制字符(ASCII0-31,再加上ASCII127)
[:digit:]    任何一个数字(等价于[0-9])
[:print:]    任何一个可打印字符(包括空格) 
[:graph:]    和[:print:]一样,但是不包含空格
[:lower:]    任何一个小写字母(等价于[a-z]) 
[:punct:]    既不属于[:alnum:],也不属于[:cntrl:]的任何一个字符(标点符号)   
[:space:]    任何一个空白字符(包括空格,等价于[\f\n\r\t\v ])(字母v后有一个空格)   
[:upper:]    任何一个大写字符(等价于[A-Z])
[:xdigit:]   任何一个十六进制数字(等价于[a-fA-F0-9])

例如:匹配十六进制rgb颜色值#333333
#[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]
[:xdigit:]表示一个元字符,而不是:xdigit:,所以外面要用[]包裹

第五章 重复匹配

匹配一个或多个字符:

+ 匹配一个或多个字符(该字符至少出现一次),如ba+ 匹配ba或baa或baaa,c[0-9]+匹配c1,c23,c7879等

匹配零个或多个字符:

* 匹配零个或多个字符(该字符可出现零次或多次),如ba* 匹配b或ba或baa或baaa,c[0-9]*匹配c,c1,c23,c7879等

匹配零个或一个字符:

? 匹配零个或一个字符(该字符可能出现零次或一次),如https? 匹配http或者https,而不会匹配httpssss

匹配的重复次数区间:

{}比如要设定某个字符出现的次数或次数区间,例如:
匹配aaa而不想匹配aa或者aaaa,可以用a{3}
匹配十六进制rgb颜色值#333333,可以用#[[:xdigit:]]{6}
匹配年月日,年份可以写2-4位,月日可以写1-2位,连接符用/或者-,可以用\d{2,4}[-\/]\d{1-2}[-\/]\d{1-2}匹配

?等价于{0,1} *等价于{0,},+等价于{1,}
{n,}不写最大次数表示无穷大,即至少匹配n

防止过度匹配:

例如匹配“<a>第一个链接</a>哈哈哈<a>第二个链接</a>”中的a标签和其中的内容:
<[Aa]>.*</[Aa]>
这将把整个字符串都匹配出来,而在*后面添加?则会匹配出“<a>第一个链接</a>”和“<a>第二个链接</a>”,即:
<[Aa]>.*?</[Aa]>

这是因为* + {n,} 等都属于贪婪型的元字符,它们会自动匹配尽量多的字符,而懒惰型元字符*? +? {n,}?等会匹配尽量少的字符,能结束匹配就会结束匹配。

第六章 位置匹配

单词边界:

\b 单词边界,符介于\w和\W之间(单词和符号之间的边界,这里的单词可以是中文字符,英文字符,数字;符号可以是中文符号,英文符号,空格,制表符,换行)
例如:\bcat\b只会匹配cat这个单词,而不是其他单词里包含的字母cat,如scattered里的cat不会被匹配。

\B 非单词边界符,匹配单词与单词,符号与符号之间的边界,等价于[^\b]

字符串边界:

^ 定义字符串的开头

$ 定义字符串的结尾

^.*$ 匹配任意字符串

分行匹配模式:

(?m) 分行匹配,要放在整个正则表达式的最前面
^ $ 与 (?m) 配合使用的时候,^ $ 还将匹配在一个换行符处开头或结束的字符串,此时换行符被视为字符串的分隔符。

后记

你好哇,我是南极大冰块,一个技术与颜值成正比的前端工程师,崇尚一针见血的搞定前端问题,希望我的博客有帮助到了你。

关注我,前端路途一起走。嘿哈~😛