javascript 正则表达式 - 学习笔记 - 持续更新
什么是正则表达式?
感觉正则是一个很神秘的东西,你给她传一串规则字符进去,她就能给你想要的字符串,就好像芝麻开门一样,给的暗号对上了门才会给我们打开,也就是说有迹可循并没有想象的那么神秘。这也激发我的正则极大兴趣,刚好最近也有点时间学习,所以这套学习笔记就诞生了。
个人理解正则表达式主要用来提取和操作各种变态的字符串,满足我们正常js代码无法操作的需求。只要学好了,夸张点说在字符串上面可以做到求必应。
正则表达式的编写格式:
市面上几乎所有的编码语言都支持正则,因为太需要了,那么js的编写格式是怎么样的呢?
据我了解,常用的有两种
第一种 也是最简单直观的一种, // 两个斜杆完事,如:匹配大写字母和小写字母,/[A-z]+/g
第二种 教程里边的叫法是,正则函数表达式,new Regexp(),那么上头的的写法应该是:new Regexp(‘[A-z]+’, ‘g’),注意参数都有单引号,是字符串的形式,这和第一种还是有点区别的。
JS如何测试和使用正则表达式?
函数 | 描述 |
---|---|
test() | 用于测试表达式是否正确,返回booleen值,也可用来做验证用,比如:表单的手机是否正确,/1\d{10}/.test(‘13455556666’),结果会返回true |
replace() | 英文的意思是替换,js是基于英文,那么意思相同了,如:’abcdffff’.replace(/ffff/, ‘zzzz’) |
replaceAll() | js中并没有这个方法,因为上面的的replace()配合正则已经能够实现任意操作方式,只要我们熟悉正则。举个简单的梨子,如:’abcdffff,jjjjfffffggjgjgj’.replace(/ffff/g, ‘zzzz’),经过测试返回结果成功,也就是说如果要批量替换,来个g就全局匹配指定的字符串了,很棒。 |
match() | match也是很重要的,可以匹配到字符串里面的任意字符,类似查找的意思,如:’456756734567456’.match(/5/g),经过测试,返回了所有5并存入了数组。 |
第一天了解的知识面:
- 元字符
- 量词
- 范围匹配(字符组)
什么是元字符?
一般配合尾部g 使用,可以匹配多个重复的结果,不匹配g到尾部,则只会匹配一次查找。
以下是工作中比较常用的元字符,使用频率较高:
元字符 | 描述 |
---|---|
. | 匹配除换行符(\n、\r)之外的任何单个字符。要匹配包括 \n 在内的任何字符,请使用像(.|\n)的模式。 |
\w | 匹配字母、数字、下划线。等价于’[A-Za-z0-9_]’。 |
\d | 匹配数字 |
\s | 匹配空白符 |
\W | 匹配字母、数字、下划线之外的字符 |
\D | 匹配数字之外的字符 |
\S | 匹配空白符之外的字符 |
\b | 匹配单词边界 |
\B | 匹配非单词边界 |
\n | 匹配换行符 |
\r | 匹配回车符 |
\t | 匹配制表符 |
什么是量词?
我所理解的量词意思应该是,需要匹配的元字符的数量,如 \d+ 则表示不仅仅匹配一个数字,则是匹配更多的相邻数字,如果不带“+”,则只会匹配第一个出现的数字的信息
以下是工作中比较常用的量词,使用频率较高:
量词 | 描述 |
---|---|
+ | 匹配更多 |
? | 匹配0到1次 |
* | 匹配数字 |
{n} | 匹配n次,即固定匹配的数量,如:简单的手机号正则匹配/1\d{10}/ |
{n,} | 最少匹配n次,最多不限 |
{n,m} | 最少匹配n次,最多匹配m次 |
什么是范围匹配符?
范围匹配符就是用于匹配再指定范围内的一个特定字符
以下是工作中比较常用的匹配符,使用频率较高:
范围匹配符 | 描述 |
---|---|
[asdf] | 匹配 asdf 这四个字符中的任意一个字符 |
[0-9] | 匹配0到9之间的任意一个数字 |
[a-z] | 匹配从小写字母a到小写字母z之间的任意字母 |
[A-Z] | 匹配大写字母A到大写字母Z之间的任意字母 |
[A-z] | 匹配大写字母A到小写字母Z之间的任意字母 |
[\u4e00-\u9fa5] | 这是匹配中文的,听说最开始是不支持中文的,不过现在支持了 |
第二天了解的知识面
什么是分组?
()就可以表示分组,如:
var str = 'abcabcabc';
str.match(/abcabcabc/); // 结果:abcabcabc
// 如果用分组
str.match(/(abc){3}/); // 结果:abcabcabc
效果一样的,但表达式更简洁。
什么是限制匹配位置?
名称 | 术语 | 介绍 |
---|---|---|
乘方符号 | ^ | 从字符串开始的位置开始匹配 |
美元符号 | $ | 从字符串结束的位置开始匹配 |
注意:如果乘方符号和美元符号同时出现在一个表达式里面,如:/^1\d{10}$/这就相当于绝对匹配了。
/^1\d{10}$/.test('13512345678') // 结果:true
/^1\d{10}$/.test('13512345678111') // 结果:false
什么是修饰符?
修饰符 | 描述 |
---|---|
i | 匹配的时候忽略大小写,如:/abcdefg/i |
m | 就行多行匹配,比如texteare里面的值,可能存在换行,而我们需要获取每行开头或结束位置的字符串,如:/^[abcd]/m表示获取每行开始的abcd、/[abcd]$/表示获取每行结束位置的abcd.注意:m修饰符需要配合限制符号乘方^和美元符号$才能看出效果。 |
g | 全局多次匹配,只要字符串里面有达标正则的字符串 |
什么是范围排除?
用于排除指定范围的字符串,即不匹配这个字符
乘方符号^ 这玩意出现在不同的位置,表示的意思也是大有不同,如:/[^abcd]/、/a^bcd/