JS正则表达式(全)

一、创建方式:

1、字面量方式
let reg = /\d/;
2、构造函数方式

‘\‘前需要加转义符‘\’,可以通过变量构造正则表达式。

let reg = new RegExp('\\d','g');
let str = '123';
console.log(str.replace(reg, 'A')); // A23
let s = '123';
let str = '123';
let reg2 = new RegExp(s,'g');
console.log(str.replace(reg2, 'A')); // A

二、正则对象下的方法:

1、test

判断字符串是否满足正则表达式的条件

let reg = /\d/;
let str = '123';
// 检查字符串是否存在数字
console.log(reg.test(str)); // true
2、exec

找出字符串中第一个满足正则表达式的条件子串并将其返回。

let str = '123abc1234';
let reg = /\d+/;
console.log(reg.exec(str)); // 123

三、字符串的方法:

1、match

找出字符串中满足正则表达式的条件子串,如果正则表达式中使用全局匹配(g),则返回一个数组。

let reg = /\d/;
let reg2 = /\d/g;
let str = '123';
console.log(str.match(reg)); // 1
console.log(str.match(reg2)); // [1, 2, 3]
2、replace

找出字符串中满足正则表达式的条件子串并将其替换。

let reg = /\d/;
let str = '123';
console.log(str.replace(reg, 'A')); // A23
3、split

找出字符串中满足正则表达式的条件子串,并以其为分割点分割字符串。

let str = '123abc1234';
let reg = /abc/;
console.log(str.split(reg)); // [123, 1234]
4、search

找出字符串中满足正则表达式的条件子串并返回其第一个字符的索引值。

let str = '123abc1234';
let reg = /abc/;
console.log(str.search(reg)); // 3

四、字符相关的元字符:

1、\w :数字、字母、下划线
let str = '123_abc.1234';
let reg = /\w+/g;
console.log(str.match(reg)); // [123_abc, 1234]
2、\W :非数字、字母、下划线
let str = '123_abc.1234';
let reg = /\W+/g;
console.log(str.match(reg)); // [.]
3、\d :数字
let str = '123_abc.1234';
let reg = /\d+/g;
console.log(str.match(reg)); // [123, 1234]
4、\D :非数字
let str = '123_abc.1234';
let reg = /\D+/g;
console.log(str.match(reg)); // [_abc.]
5、\s :空格
let str = '123_ abc .1234';
let reg = /\s+/g;
// 删除空格
console.log(str.replace(reg, '')); // 123_abc.1234
6、\S :非空格
let str = '123_ abc .1234';
let reg = /\S+/g;
console.log(str.match(reg)); // ["123_", "abc", ".1234"]
7、. :非 \n \r \u2028 \u2029
let str = '123_ \nabc .1234';
let reg = /.+/g;
console.log(str.match(reg)); // ["123_ ", "abc .1234"]

五、数量相关的元字符:

1、{} : 规定数量的范围
let str = '123_ \nabc .1234';

// {n} : n个字符
let reg = /\d{4}/g;
console.log(str.match(reg)); // ["1234"]

// {n,} : n个及以上字符
let reg = /\d{3,}/g;
console.log(str.match(reg)); // ["123", "1234"]

// {n,m} : n-m个字符
let reg = /\d{3,4}/g;
console.log(str.match(reg)); // ["123", "1234"]
let str = '12345678';

// 贪婪匹配
let reg = /\d{2,4}/g; 
console.log(str.match(reg)); // ["1234", "5678"]

// 惰性匹配
let reg = /\d{2,4}?/g; 
console.log(str.match(reg)); // ["12", "34", "56", "78"]
2、? :没有或者只有一个字符
let str = '123_ \nabc .234';
let reg = /\d?23/g;
console.log(str.match(reg)); // ["123", "23"]
3、+ :有一个及以上个字符
let str = '123_ \nabc .234';
let reg = /\d+/g;
console.log(str.match(reg)); // ["123", "234"]
4、* :没有或有一个及以上个字符
let str = '123_ \nabc .1234';
let reg = /123\d*/g;
console.log(str.match(reg)); // ["123", "1234"]

六、位置相关的元字符:

1、^ :开头
let str = '12345678';
let reg = /^\d{2}/g;
 console.log(str.match(reg)); // ["12"]
2、$ :结尾
let str = '12345678';
let reg = /\d{2}$/g;
 console.log(str.match(reg)); // ["78"]
3、\b :边界符

边界:非\w

let str = 'you are handsome and smart';
let reg = /\bar/g;
console.log(str.match(reg)); // ["ar"]
4、\B :非边界符
let str = 'you are handsome and smart';
let reg = /\Bar/g;
console.log(str.match(reg)); // ["ar"]

七、括号

1、() :分组、提取值、替换、反向引用
// 分组
let str = 'ababab12345';
let reg = /(ab){3}/g;
console.log(str.match(reg)); // ["ababab"]

// 提取值
let str = '2021-08-23';
let reg = /(\d{4})-(\d{2})-(\d{2})/;
str.match(reg);
console.log(RegExp.$1); // 2021
console.log(RegExp.$2); // 08
console.log(RegExp.$3); // 23

// 替换
let str = '2021-08-23';
let reg = /(\d{4})-(\d{2})-(\d{2})/;
let a = str.replace(reg, function(arg, $1, $2, $3) {
    return $3 + '/' + $2 + '/' + $1;
});
console.log(a); // 23/08/2021

// 反向引用
// 保证前后两个分隔符是相同的,即****-**-**或者****/**/**
// ****-**/** 为错误的
// 可以通过\数字(数字表示第几个())来反向引用前面的值。
let str1 = '2021-08-23';
let str2 = '2021/08/23';
let str3 = '2021-08/23';
let reg = /\d{4}(-|\/)\d{2}\1\d{2}/;
console.log(reg.test(str1)); // true
console.log(reg.test(str2)); // true
console.log(reg.test(str3)); // false
2、[] :字符集合
let str = '2021-08-23';
let reg = /[0-9]{4}-[0-9]{2}-[0-9]{2}/;
console.log(reg.test(str)); // true

// ^ : 非
let str = 'aaaa2021-08-23';
let reg = /[(^a-z)0-9]{4}-[0-9]{2}-[0-9]{2}/;
console.log(str.match(reg)); // ["2021-08-23"...]

八、匹配模式

1、g :全局匹配模式
let str = '2021-08-23';
let reg1 = /[0-9]{2}/;
let reg2 = /[0-9]{2}/g;
console.log(str.match(reg1)); // ["20"]
console.log(str.match(reg2)); // ["20", "21", "08", "23"]

// 全局模式下,正则对象每次exec或者test都会将lastIndex值变为上次查找的末位
// 下次从lastIndex开始查找
let str = '2021-08-23';
let reg1 = /[0-9]{2}/;
let reg2 = /[0-9]{2}/g;
console.log(reg1.exec(str)); // ["20"]
console.log(reg1.exec(str)); // ["20"]
console.log(reg2.lastIndex); // 0
console.log(reg2.exec(str)); // ["20"]
console.log(reg2.lastIndex); // 2
console.log(reg2.exec(str)); // ["21"]
console.log(reg2.lastIndex); // 4
console.log(reg2.exec(str)); // ["08"]
console.log(reg2.lastIndex); // 7
console.log(reg2.exec(str)); // ["23"]
console.log(reg2.lastIndex); // 10
console.log(reg2.exec(str)); // null
console.log(reg2.lastIndex); // 0
console.log(reg2.exec(str)); // ["20"]
2、i :不区分大小写模式
let str = 'Abc';
let reg = /abc/i;
console.log(reg.test(str)); // true
3、m :多行模式
let str = `123
456
567`;
let reg = /^\d/g;
let res = str.replace(reg, '*')
console.log(res); 
// *23 
// 456 
// 567

// 使用多行模式后
let str = `123
456
567`;
let reg = /^\d/gm;
let res = str.replace(reg, '*')
console.log(res); 
// *23 
// *56 
// *67
4、s :让“.”匹配到换行(\n)
let str = '12345\n656';
let reg1 = /\d{5}./g;
let reg2 = /\d{5}./gs;
console.log(reg1.test(str)); // false
console.log(reg2.test(str)); // true
5、u :匹配Unicode编码
let str = 'a12345a656';
let reg1 = /\u{61}/;
let reg2 = /\u{61}/u;
console.log(reg1.test(str)); // false
console.log(reg2.test(str)); // true
6、y :粘性模式
// 粘性模式:断了之后就不再继续匹配了
let str = '12345a656';
let reg1 = /\d/g;
let reg2 = /\d/gy;
console.log(str.match(reg1)); // ["1", "2", "3", "4", "5", "6", "5", "6"]
console.log(str.match(reg2)); // ["1", "2", "3", "4", "5"]

九、命名分组

let str = '2021-08-23';
let reg = /(?<year>[0-9]{4})-(?<month>[0-9]{2})-(?<day>[0-9]{2})/;
console.log(str.match(reg).groups); // {year: "2021", month: "08", day: "23"}

十、零宽断言

1、正向零宽断言

判断的时候使用?=后面的东西,真正替换时不做替换。

// 肯定
let str = 'student1student2student';
let reg = /[a-z]{7}(?=\d)/g;
console.log(str.replace(reg, '学生')); // 学生1学生2学生1学生2student

// 否定
let str = 'student1student2student';
let reg = /[a-z]{7}(?!\d)/g;
console.log(str.replace(reg, '学生')); // student1student2学生
1、负向零宽断言
// 肯定
let str = '1cm2cmcm';
let reg = /(?<=\d+)cm/g;
console.log(str.replace(reg, '厘米')); // 1厘米2厘米cm

// 否定
let str = '1cm2cmcm';
let reg = /(?<!\d+)cm/g;
console.log(str.replace(reg, '厘米')); // 1cm2cm厘米
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

易山易酒易诗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值