正则表达式是什么
Regular Expression 按照某种规则查找符合规则的字符串
正则表达式的小工具
正则对象
// 字面量
var reg = /\bis\b/g
// 建正则对象
var reg1 = new RegExp('\bis\b', 'g')
正则表达式修饰符
修饰符 | 英文 | 描述 |
---|---|---|
i | ignoreCase | 大小写不敏感匹配 |
g | global | 全局匹配 |
m | multiline | 多行匹配 |
1.元字符
字符类
var reg = /[abc]/
// 字符类取反,即不是a,b, c的字符
var reg = /[^abc]/
范围类
[a-z], [A-Z]
var reg = /[a-z]/
预定义类
字符类 | 英文描述 | 描述 |
---|---|---|
\d | digital | 数字 |
\D | not Digital | 非数字 |
\s | space | 空格 |
\S | not space | 非空格 |
\w | word | 单词符(字母, 数字,下划线) |
\W | not word | 非单词符号 |
2.量词
字符 | 描述 |
---|---|
? | {0, 1} 0或1次 |
+ | {1, } 1次以上 |
* | {0, } 0或者任意次数 |
{n} | n次 |
{n, m} | n到m次 |
{n,} | n次以上 |
贪婪模式,非贪婪模式
默认贪婪模式,尽量匹配更多
量词 + ? ,表示开启非贪婪模式,匹配更少
'123456789'.replace(/\d{3,6}/g, 'A')
'123456789'.replace(/\d{3,6}?/g, 'A')
3.分组
()表示分组,分组后面加量词表示分组内的表达次作用了n次
| 表示或
反向引用
如何把 2021-04-15 替换成为 04/15/2021
()括号内的是分组,替换时可以用$n表示
(?: xx) ?:表示忽略该分组,从后面一个分组开始算$1
var reg = /(\d{4})-(\d{2})-(\d{2})/g;
var str = '2021-04-14'.replace(reg, '$2/$3/$1');
console.log(str)
4.前瞻断言
名称 | 正则写法 | 描述 |
---|---|---|
正向前瞻 | exp(?=assert) | 匹配的是exp,但是后面不assert时有效 |
负向前瞻 | exp(?!assert) | 匹配的是exp,但是后面不assert时有效 |
正向后顾 | exp(?<assert) | javascript不支持的语法 |
负向后顾 | exp(?<!assert) | javascript不支持的语法 |
var pattern=/api(?!\/v1)/;
// 表示'api'字符串后面不是以’/v1‘结尾时,'api'是有效的匹配
var str='api/v1';
var str1='api/av1';
console.log(pattern.test(str)) // false api后面紧跟的是/v1时候验证不通过
console.log(pattern.test(str1)) // true api后面紧跟的不是/v1时候验证通过
5.正则对象方法test,exct
test
test 返回 Boolean,查找对应的字符串中是否存在模式。
var str = "1a1b1c";
var reg = new RegExp("1.", "");
alert(reg.test(str)); // true
exec
exec 查找并返回当前的匹配结果,并以数组的形式返回。
不带global模式中,数组中总是只有第一个匹配结果
var str = "1a1b1c";
var reg = new RegExp("1.", "");
alert(reg.exec(str)[0]); // 1a
alert(reg.exec(str)[0]); // 1a
带global的话,重复执行可得到下一个结果,因为exec会读取lastIndex继续匹配
var str = "1a1b1c";
var reg = new RegExp("1.", "g");
alert(reg.exec(str)[0]); // 1a
alert(reg.exec(str)[0]); // 1b
所以一般用这个返回值arr[0],获取正则结果即可
6.String对象中正则表达式方法:match,split, replace
match
global模式下返回了符合条件的数组
var str = "1a1b1c";
var reg = new RegExp("1.", "g");
console.log(str.match(reg));
// ["1a", "1b", "1c"]
split
用正则表达式切分字符串
var str = 'a1b22c333d44e';
var arr = str.split(/\d+/g);
console.log(arr)
replace
str.repalce(str, replaceStr)
str.repalce(reg, replaceStr)
str.repalce(reg, function)
使用function回调参数时可替换字符串元素时,可自定义相关逻辑
const result1 = 'a1b2c3'.replace(/\d/g, function(match, index, origin) {
console.log(match, index, origin)
// 1 1 a1b2c3
// 2 3 a1b2c3
// 3 5 a1b2c3
return parseInt(match) + 1
})
console.log(result1)
// result a2b3c4
const result2 = 'a1bc2de3f'.replace(/(\w)(\d)(\w)/g, function(match, group1, group2, group3, index, origin) {
console.log(origin)
return group1 + group3
})
console.log(result2)
// result abcdef
网友评论