写在前面:
最近在刷LeetCode,碰到一个题因为用到了正则表达式,正好作为小白这一块没怎么接触过,所以索性借这个题,把这个知识点彻底搞一下,下面的内容来自我听B站UP奇乐编程学院的视频写的学习笔记,所有的细节应该很全很详细。如果大家还觉得只看博客不过瘾的话,可以去B站上看着视频,UP讲得很细!
正则表达式
正则表达式, regex 或者 regexp(有时称为有理表达式)是定义搜索模式的字符序列。通常这种模式通过字符串搜索算法用于字符串上的“查找”或“查找并替换”操作 ,或者用于输入验证。它是在 理论计算机科学 和 形式语言 理论中发展起来的一种技术。(来自搜狗百科)
说白了就是进行字符匹配。
一、限定符
- ? :表示问号前面的字符可以为0或者为1,所以这里匹配到的是use或者used
- 星号* 代表*前面的字符可以没有,也可以出现多次,匹配如下:**
之所以没有匹配到adc,是因为明确限制了在ac之间只能出现0个b或者多个b,而不能出现其他字符
- +会匹配出现一次及以上的字符
如果想要特定匹配在ac之间允许出现的b的次数,则可以使用花括号的方法
花括号里面也可以是允许出现的b的次数的范围
如果想要不设上界的话,可以把其中的6删掉
如果想要匹配多个字符的话,可以使用下面的这种方式,就可以进行ab的匹配
二、运算符
这里使用或运算符|来进行匹配,a 空格用来匹配下面的a空格,或运算符表示后面匹配的可以是cat也可以是dog
字符类
如果我们想要匹配由abc组成的字符的单词,那么可以使用[abc]+来进行匹配。表示匹配到的字符串中的字符只能取自于方括号里面的字符。
其中方括号中还可以写范围:
- [a-z]+表示匹配所有的小写英文字符
- [a-zA-Z]+表示所有的英文字符
- [a-zA-Z0-9]+表示所有的英文字符和数字
我们也可以在最前面使用^,表示匹配所有的非后面指定的字符的字符
三、元字符
\d 代表匹配数字字符 \D 代表匹配非数字字符
\w 代表匹配单词字符(英文,数字和下划线) \W 代表匹配非单词字符
\s 代表匹配空白符(包括tab和换行符) \S 代表匹配非空白符
. 代表任意字符但不包含换行符
^会去匹配行首,$会去匹配行尾
贪婪与懒惰匹配
贪婪匹配
加个?变为懒惰匹配
例1 匹配十六进制RGB颜色值
其中先匹配#,接着方括号中要匹配的是0-9,a-z, A-Z,限制是6位,所以后面的花括号中为6,再添加个\b边界限制符,不匹配多于6个字符的。
例2 匹配ipv4地址
.表示对.进行转义,这里用.表示IP地址里面的.
这里我们发现没有完全匹配成功,因为256.1.1.1不是IP地址,所以修改如下:
- 25[0-5]:表示前两位是25,第三位可以是0-5
- 25[0-5]|2[0-4]\d:在上一个限制的前提下,如果第一位是2,第二位可以0-4,第三位可以是0-9
- (25[0-5]|2[0-4]\d|[01]?\d\d?):在上一个限制的前提下,如果第一位是0或者1,第二位则可以是0-9,第三位也可以是0-9,其中?表示第一位和第二位可以有,也可以没有
- ((25[0-5]|2[0-4]\d|[01]?\d?\d).){3}:后面的花括号里面的三次,表示把前面的匹配条件重复匹配3次
- \b表示边界限制符