这是我参与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,使用十六进制值
在正则表达式里,十六进制(逢16进1)数值要用前缀\x来给出。比如说,\x0A对应于ASCII字符10(换行符),其效果等价于\n。
2,使用八进制值
在正则表达式里,八进制(逢8进1)数值要用前缀\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) 配合使用的时候,^ $ 还将匹配在一个换行符处开头或结束的字符串,此时换行符被视为字符串的分隔符。
后记
你好哇,我是南极大冰块,一个技术与颜值成正比的前端工程师,崇尚一针见血的搞定前端问题,希望我的博客有帮助到了你。
关注我,前端路途一起走。嘿哈~😛