前言
学正则的时候,比较头疼。知识点很零碎又多,容易忘记,而且潜藏的差距细节点,当下通过测试知道了,但不汇总记录的话,后面回过头看,很容易忽略。所以写这篇博文,一次汇总记录正则表达式的一些常见用法和我觉得需要记住的点。
一、正则表达式
一句话说,正则表达式就是一类固定内容的表达写法。
(1) 构造函数写法
(2) 字面量写法
(3) 修饰符
- g:global,代表全局,全文搜索,不添加的话搜索到第一个结果停止搜索
- i:ingore case,忽略大小写,默认大小写敏感
- m:multiple lines,多行搜索
二、正则表达式--字符类
对于这个知识点,重点我觉得就是关注使用中括号的表达式和不写中括号的表达式的含义区别。
(1) 非字符类写法和字符类写法:
- /el/的写法,el会被当做一个整体,只有当字符串中el是连在一起的,才替换el为一个0;
- /[el]/的写法,中括号中的每一个字符,对应去替换字符串里e或l字符,对找到的e或l都分别替换为0。
(2) 区别:
1)正则表达式中没有使用中括号括住的字符串,每一个字符之间是“and”关系,一模一样字面写法的字符串才会被匹配上。而使用中括号括住的字符串,则构建出一个字符类,中括号中的每一个字符,都会被当为一个单独的字符,之间是“或”的关系。
2)中括号中的取反,作用整个中括号内的正则式,匹配不属于中括号中写明的这一类的内容,这个取反是对整个表达式所指的类内容的取反。[abc],是指不属于a或b或c,而非仅仅是“不属于a”。记得取反是在中括号里才有的。
三、正则表达式--范围类
相对于/[abcdefg]/的写法,/[a-g]/的写法就是使用a-g表示a到g范围的字母字符,称之为范围类,两者等同。
三、正则表达式--预定义类
对于这个知识点,记住以下的预定义类以及代表的含义:
用法举例:
四、正则表达式--边界
以上预定义类、范围类、字符类匹配的都是一个字符而已。例子如下:
而如果我们要匹配多个字符的话,那我们就需要加入边界的概念:^、&、\b、\B
(1) 单词边界的注意点:
\b和\B,这两个单词边界,只截取左右为空格的单词;而且对*、#、-,也会当成是空格来对待进行截取。
(2) ^和$的注意点:
对于这个符号,对比匹配的时候,就是看后面跟的全部字符内容有没有都在前面的字符里有,如果^后面跟的全部字符没有全部都对应有的话,就为false或match截取失败。
对于^和$的作用范围的测试例子:
^和$以具体某一字符串作为匹配,就是以这个字符串开头,以这个字符串结尾:
五、正则表达式--量词
为了避免重复写多个相同的字符串,我们可以使用量词:
? + * {n} {n,m} {n,},这些都是只对其前面的一个字符起作用,如果要对多个字符起作用,多个字符要用代表分组的括号括起来
六、正则表达式--转义字符
正则和字符串的配合使用,让字符串操作更加简便
七、正则表达式--分组()和“或”|的使用
(1) 分组
分组符号()是连着用的,而没有“或”用意的用法
(2) “或|”
“或|”是只要满足执行过一次就不会执行后面的,所有需要加个/g,把满足条件的都做处理,变成and的做法
(3) 分组()和“或”|的合并使用
以下三种写法是等同的
'hunger Hunger'.match(/[Hh]unger/g)
'hunger Hunger'.match(/(H|h)unger/g)
'hunger Hunger'.match(/Hunger|hunger/g)
八、边界、或、组合、数字的应用综合例子
从多个class中找到指定的classname(判断在class在开头、在中间、在结尾、以它开头以它结尾的三种情况):
九、正则表达式--方法
正则表达式是一个特殊的对象,它也有自己的自带方法
(1) test方法
test方法测试的目标字符串与正则表达式是否匹配,是的话就返回true,否则返回false。
但结合正则表达式的中括号特性,test方法测试就会变成只要有一个目标字符,匹配上中括号内写的正则表达式,就返回true,而不管目标字符串后面其他字符的内容。因此我们对使用test方法对一个字符串做匹配判断,常用取反的方式,反向判断,字符串中只要存在一个不满足正则式条件的字符,就返回false。
在此例子中,目标字符串中包含*号,也会被判定为是true,按照[a-zA-Z0-9_]的正则表达式,这显然不是我们想要的。因此我们对中括号中的表达式结果取反。
(2) match方法
Match方法的执行结果是null或者是一个数组