JS中的正则
正则是什么
正则是处理字符串的一种规则 JS中的正则具体体现出来是一种数据类型 RegExp ,是一种引用数据类型数据
JS编写正则的两种方式
- 字面量的实例形式:
var reg = /q/
- new 的方式创建
涉及到变量时候会偶尔用new的方式创建正则,一般都是字面量的方式
var reg = new RegExp('q')
正则一般有两种用途
- 用于匹配 test
- 编写一个正则,看对应的字符串是否符合该正则
- 用于捕获 exec
- 编写一个正则,可以把对应字符串中的符合规则的部分获取到
正则的组成结构
正则双斜杠中的内容 我们称为元字符,斜杠外边的内容我们称为修饰符 常用的元字符可以分为 有特殊含义的元字符量次元字符 普通元字符
元字符
有特殊含义的元字符
- \ :转义
- \d :0~9之间的数字
- \D:除0~9以外的字符
- \w :代表数字 字母 下划线
- \W :除数字 字母 下划线以外的字符
- ^:代表以什么字符开头
- $:代表以什么字符结尾
- . :代表 除了换行符以外的所有的字符
- \n :换行符
- x|y :字符x 或者字符y(x和y可以是多个字符)
- [ab] :代表字符a或者字符b(a和b只能是单个字符)
- [^ab] : 代表非a b
- [a-z] :代表a-z之间任意字符 小写字母
- [^a-z] :代表除了小写字母
- () :分组和提升优先级
- (?:) :非捕获匹配
- (?=)
- (?!)
量词元字符
- ? :前边的字符出现了 0 或者 1 次
- +: 前边的字符出现了 1 或者 多次
- * : 代表的字符出现了 0 或者多次
- {n} :前边的字符出现了至少连续的n次
- {n,m}: 前边的字符出现了n 到 m 次
- {n,} : 前边的字符出现了 n 到多次
修饰符
- i :忽略大小写 ignoreCase
- m : 多行匹配 mutiline
- g : 全局匹配 global
var str = '2019-9-23';
// str = str.replace(/-/g, '/');
console.log(str.replace(/-/g,'/'));
var ary = ['qqq', 'www', 'yyy'];
var arr = ary.map(item => new RegExp(item)) ;
console.log(arr);
正则匹配
写一个正则 去匹配字符串,字符串中有符合正则 的字符就返回true,否则就返回false
<script>
var reg = /d/;//匹配字符串中的d
console.log(reg.test('nnj07vgh'));//false
console.log(reg.test('ndjjkjk'));//true
var reg = /\d/;
console.log(reg.test('jjsjkj'));//false
console.log(reg.test('9bbjh'));//true
var reg = /\d{2}/;//至少出现连续的两个数字
console.log(reg.test('9'));
console.log(reg.test('99'));
console.log(reg.test('jknk0bhj'));
console.log(reg.test('jknk0865bhj'));
var reg = /\\d/;//第一个\代表转义把第二个\转成了不具有转义意义的字符\ 正则的意思就是匹配字符\d
console.log(reg.test('99h'));//f
console.log(reg.test('bhj\ddd98yv'));//f
console.log(reg.test('\\d'));//t
var reg = /^\d.123$///以数字开头以3结尾 3前边是个12 12前边是一个除了换行符以外的任意字符
console.log(reg.test('8\n123'));
console.log(reg.test('8.123'));
console.log(reg.test('8n123'));
var reg = /^\d\.123$/;//. 不再代表正则中除了换行符以外的任何 而是只代表一个普通字符. 此正则代表以任意数字开头 以3结尾 中间是.12
console.log(reg.test('3.123'));
console.log(reg.test('5n123'));
var reg = /[a-c]/; // 只要有一个 a或者b或者c ; 结果就是true
console.log(reg.test('aqweaqe'))
var reg = /^[a-c]/; // 只要以 a或者b或者c 开头的字符串; 结果就是true
var reg = /^[a-c]{2}/; // 只要以 a到c之间的任意两个字符开头的字符串 结果都是true;
var reg = /[a-z0-9]/; // 小写字母和数字
var reg = /[0-9a-z]/;// 小写字母和数字
var reg = /[0-9a-zA-Z_]/; // \w
var reg = /[.]/ // 中括号中的点 代表 点 本身;
var reg = /^18|19/;//以18开头 或者有19;或的优先级高
var reg = /18|19$/;//含有18 或以19结尾
var reg = /^18|19$/;//以18开头 或以19结尾
var reg = /^(18|19)$/;//18 19/^1[89]$/
</script>
正则匹配
- 匹配有效数字
有效数字:可以有正负号,可以有小数部分,整数部分不能以0开头
var reg = /^[-+]?([1-9]\d|\d+)(\.\d+)?$/
- 身份证
前边6位行政区号 4位年份2位月份2位天,最后一位可能是随意数字 也可能是X
let reg=/^\d{6}(\d{4})(\d{2})(\d{2})\d{2}(\d)(\d|X)$/;\d[\d|X]/
正则捕获
reg .exec(str) :从字符串中获取 满足正则的字符
var reg = /\d+/;
var str = 'hello2019hello2020';
console.log(reg.exec(str));
exec 捕获结果 : 第一项是大正则捕获的内容,第二项及以后是小分组捕获到的内容 第二项式第一个小分组; 第三项是第二个小分组 若字符串中没有任何符合正则的内容 ,则获取到的内容就是一个null
var reg = /([a-z]+)(\d+)/
var str = 'hello2019hello2020';
console.log(reg.exec(str))
正则的贪婪性
一次性会把所有满足正则的字符都捕获到 解决正则的贪婪性:加?
var reg = /\d+?/;
var str = 'hello2019hello2020';
console.log(reg.exec(str));
正则的懒惰性
只捕获一次,不再不厚其他符合正则的字符 通过添加全局修饰符g 解决; 加上g之后,每次捕获时都会更新lastIndex 属性 lastIndex属性控制的是下一次开始匹配的起始索引 test 和 exec都会更新lastIndex属性
var reg =/([a-z]+)(\d+)/g;
var str = 'bye2019hello2020';
console.log(reg.exec(str));
console.log(reg.exec(str));
转载自:https://juejin.cn/post/6844903954720129038