正则的创建
字面量创建方式
let reg
= /^$/
实例创建 RegExp
构造函数创建方式,可以实现正则的拼接传递的参数是一个字符串利用字符串可以拼接的特点,能够实现正则传递变量可以引入变量如果出现转义字符,转义前面再加一个\
let reg
= new RegExp('')
let str
= '\\d';
let str1
= '\D'
console
.log(str
)
console
.log(str1
)
------------------------------------------------------------
var name
="js"
var reg
= new RegExp(name
)
var reg1
= new RegExp("\\d"+name
)
console
.log(reg
)
正则的基础
正则:属于引用数据类型
用来处理字符串的一个规则
正则由元字符和修饰符组成
test:检测,匹配:如果检测成功,返回true,没有检测成功返回false
exec:捕获;返回一个数组;其中第一项就是捕获到的内容,第二项捕获内容开始的索引,第三项是要检测的整个字符串的整体
match:
字符串的方法:匹配他是字符串的一个方法,在String类的原型上,这个方法传递一个正则,返回是是一个数组如果正则不加g,跟exec返回值一样加g;全局捕获;捕获多次,把符合正则内容的字符串都放到一个数组中;缺点:如果要进行分组捕获,那他就拿不到分组捕获的内容了
注意:如果正则捕获不到内容返回值就是null
var str
="ls199hh88";
var reg
= /\d+/g;
console
.log(reg
.exec(str
))
console
.log(reg
.exec(str
))
-------------------------------------------------------------------------------------
let reg
= /^3$/
console
.log(reg
.test('3werr'))
console
.log(reg
.test('32'))
console
.dir(RegExp
)
console
.log(reg
.exec('3'))
正则的规则
正则由两部分组成:元字符和修饰符
修饰符:就是把正则额外的修饰一下 i: 不区分大小写 m:多行匹配 g:全局匹配
元字符:量词元字符、普通元字符、特殊元字符 (在正则中有特殊的含义的一些字符)
量词元字符:代表出现的次数 *:代表0到多次 +:出现一到多次 ?:出现0到1次 {n}:出现n次 {n,}:至少出现n次 {n,m}出现n到m次
特殊元字符:单个或者多字符组合在一起具有特殊意义 \:转义字符:可以把普通元字符字符转换为特殊的元字符,也可以把特殊元字符转换为普通元字符 // . :除了换行符以外的任意字符 ^:以什么什么开头 // $:以什么什么结尾 // \n:换行符 \d:0-9之间的数字 // \D:0-9以外的任意字符 \w:数字、字母、下划线 ,匹配包含下划线的任意字符[0-9a-zA-Z_] \W:[^0-9a-zA-Z_] \s:空白字符 \t是制表符,空格,为4个字符的空格 \b:单词边界 \B:匹配非单词边界 x|y:取x或y的任意一个 // [xyz]:取x、y、z中的任意一个 // [a-z]:在a到z范围内取一个 // [^a-z]:取反,除了xyz中的任何一个 ():分组 // (?: ) :只匹配不捕获(没有空格) (?=):正向预查 (?!):负向预查
普通元字符: let reg = /name/
[\s\S] 意思是匹配所有 空白复字符+非空白字符 , 说白了也就是全部字符都可以
js去除字符串中的所有空格:str.replace(/\s/g,"");\s匹配单个空格字符,包括ASCII空格,制表符,换行符,回车符,垂直制表符和换页符
正则的分组 ()
1、改变了正则的优先级
2、分组引用
分组引用
([a-z])\1:相当于把前面一样的值拿过来,在出现一次\1:代指和第一个分组一模一样的内容
let str
= 'moon'
let reg
= /^[a-z]{4}$/
console
.log(reg
.test('asdf'))
let reg
= /^[a-z]([a-z])\1\1[a-z]$/
console
.log(reg
.test('foood'))
3、分组捕获
正则捕获的时候会把最大的内容捕获一次,然后在把每一个分组捕获一次用于小正则的捕获
小括号要进行捕获,从左往右依次进行捕获
let reg
= /^([a-z])([a-z])\1\2$/
console
.log(reg
.test('qwqw'))
4.转义
转义字符( \可以把在正则中有特殊意义的字符转义为普通字符,也可以把普通字符转换以有意义的字符)
let reg
= /^23\.45$/
.在正则中代除换行符外的任意字符
\可以把有特殊意义的元字符转换为普通字符,也可以把普通字符转换为有意义的元字符
console
.log(reg
.test('23e45'))
console
.log(reg
.test('23.45'))
[]
一般情况在中括号里出现的字符都是普通字符中括号中不识别多位数
1、中括号里放的一般都是普通字符
let reg
= /^[@+]$/
console
.log(reg
.test('+'))
console
.log(reg
.test('@'))
let reg
= /^[\\d]$/
console
.log(reg
.test('d'))
console
.log(reg
.test('\\'))
2、中括号不允许出现多位数
let reg
= /^[12-57]$
/
console
.log(reg
.test('30'))
console
.log(reg
.test('1'))
console
.log(reg
.test('4'))
console
.log(reg
.test('7'))
console
.log(reg
.test('6'))
正则的正负向预查
正向预查 ?=
var reg
=/ls(?=haoren)/;
console
.log(reg
.test("lshaoren"))
负向预查 ?!
如果ls后面跟着不是haoren的,能够匹配成功,返回true,否则返回false;
var reg
=/ls(?!haoren)/;
console
.log(reg
.test("lshaoren"))
正则的捕获
小括号:也要进行以此捕获,从左往右依次进行捕获?: 取消捕获(放在哪取消哪)
正则的懒惰性
在正则捕获时,如果第一次捕获到内容,就不会再继续捕获(这叫正则的懒惰性)懒惰性:正则找到符合正则的值以后,就不再捕获了
取消正则的懒惰性,用正则的修饰符gg:每捕获一次,当前正则的lastIndex就会被修改成下一轮开始捕获的索引位置reg.lastIndex:是下一轮捕获开始的索引位置
数组的第一项是最大的捕获
以后数组的每一项是分组捕获的内容
index:第一次捕获的内容的开始位置的索引
input:原字符串
function myExec(str
){
if(!this.global
){
return this.exec(str
)
};
let ary
= [];
let res
= this.exec(str
)
while(res
){
ary
.push(res
[0])
res
= this.exec(str
)
}
return ary
.length
=== 0?null:ary
;
};
RegExp
.prototype
.myExec
= myExec
;
console
.log(reg
.myExec(str
))
正则的贪婪性
正则在匹配的时候能多匹配一个就多匹配一个,这就是正则的贪婪性在量词元字符的右边出现?,那就是取消正则的贪婪性贪婪性
?放在量词的后面是取消捕获的贪婪性的
let str
= 'ls2019ls2020';
let reg
= /\d+?/g
console
.log(str
.match(reg
))
exec的捕获
exec:他是正则实例的一个公有属性,他是用来捕获符合规则的字符串的
1、返回值:是一个数组,如果捕获不到就是null2、如果是数组
1、第一项是最大的捕获内容2、以后数组的后几项就是分组捕获的内容3、index是第一次捕获位置的索引4、input是原字符串 3、如果你只匹配不捕获,就在小括号里加?:4、exec只能捕获到第一次出现的符合正则规则的内容(这是正则捕获的懒惰型,默认只捕获第一个)
let reg1
= /^(\d{6})(\d{4})(\d{2})(\d{2})\d{2}(\d)(\d|X)$/;
let str
= '13073020020528421X';
console
.log(reg1
.exec(str
))
let reg
= /\d{2}/g;
let str
= 'w33w33ww';
console
.dir(reg
)
console
.log(str
.match(reg
))
通过match捕获
match:
字符串的方法:匹配他是字符串的一个方法,在String类的原型上,这个方法传递一个正则,返回是是一个数组如果正则不加g,跟exec返回值一样加g;全局捕获;捕获多次,把符合正则内容的字符串都放到一个数组中;缺点:如果要进行分组捕获,那他就拿不到分组捕获的内容了 自己封装的捕获方法
function execAll(str
){
if(!this.global
){
return this.exec(str
)
}
let big
= [],
small
= [],
res
= this.exec(str
)
while(res
){
big
.push(res
[0])
small
.push(res
[1])
res
= this.exec(str
)
}
return big
.length
=== 0?null: {big
,small
}
}
RegExp
.prototype
.execAll
= execAll
;
console
.log(reg
.execAll(str
))
replace捕获
replace :字符串的替换;原有字符串不发生改变,会得到一个替换之后的返回值;
每次只能替换一个 结合正则
用正则对字符串进行捕获,把捕获到的内容替换成后面的字符串 正则和回调函数
正则对字符串进行捕获,并且将回调函数的返回值覆盖捕获到的内容;正则捕获几次,这个回调函数就执行几次回调函数执行时,会把每一次捕获的内容当做实参传递给回调函数里回调函数的返回值会把每一次捕获的内容替换
let str
= 'ls33ls33'
str
= str
.replace(/ls/g,function(){
console
.log(arguments
)
return 'lshaoren'
})
console
.log(str
)
---------------------------------------------------
var str
= "123or456";
var newStr
= str
.replace(/\d+/g,function(a
,b
,c
){
console
.log(a
);
console
.log(b
);
console
.log(c
);
});
console
.log(newStr
);
例子:正则表达式
匹配有效数字:1、1.5、+2、0、-1
开头有可能是±号,也有可能没有 ?如果是个位数[0-9] 两位数 ([1-9]\d+)小数 (.\d+)? 可以不出现,也可以出现1次
匹配密码
6到16位组成由数字、字母、下划线组成
邮箱
let reg
= /^[a-zA-Z0-9-_]+@[a-z0-9]+(\.[a-z]+)+$/
匹配中文名字 [\u4E00-\u9FA5]
身份证
18位前6位是省市中间8位是生日倒数四位
前两位是公安局代码第三位是性别,奇数是男,偶数是女最后一位是数字,有可能是X
1、数组的第一次最大的捕获
2、以后数组的每一项是分组捕获的内容
3、index:第一次捕获的内容的开始位置的索引
4、input:原字符串
let str
= '33ss33ss';
let reg
= /\d{2}/g
console
.log(reg
.test(str
))
console
.log(reg
.exec(str
))
console
.log(reg
.lastIndex
)
使用replace的例子
用函数把good good study day day up首字母变成大写
function toFirstUpperCase() {
let reg
= /\b([a-z])[a-z]*\b/g;
let newStr
= this.replace(reg
, function () {
let [word
, firstWord
] = arguments
firstWord
= firstWord
.toUpperCase()
word
= word
.slice(1)
return `${firstWord}${word}`
})
return newStr
}
String
.prototype
.toFirstUpperCase
= toFirstUpperCase
;
let str
= 'good good study day day up';
console
.log(str
.toFirstUpperCase())
字符串时间格式化
在后台工作中会给我们返回字符串格式的时间
function formatTime(template
= '{0}年{1}月{2}日 {3}时{4}分{5}秒'){
let timeAry
= this.match(/\d+/g);
template
= template
.replace(/\{(\d)\}/g, function(content
, index
){
let time
= timeAry
[index
] || "00";
time
.length
<2? time
= "0"+time
:null;
return time
})
return template
console
.log(timeAry
)
}
String
.prototype
.formatTime
= formatTime
;
console
.log(time
.formatTime('{1}~{2} {3}:{4}'))
获取网址=号左右
let url
= 'http://www.baidu.com?name=erYa&age=18#index';
function queryUrlParams() {
let reg
= /([^?=&#]+)=([^?=&#]+)/g;
let obj
= {};
this.replace(reg
, (content
, key
, value
) => {
obj
[key
] = value
;
});
this.replace(/#([^?=&#]+)/, (content
, value
) => {
obj
['hash'] = value
;
})
return obj
;
}
String
.prototype
.queryUrlParams
= queryUrlParams
;
console
.log(url
.queryUrlParams());
首字母小写转大写
var str
= "my name is niu ,i am 28 years old";
var newStr
= str
.replace(/[a-z]+\b/g, function (a
) {
return a
[0].toUpperCase() + a
.slice(1)
})
console
.log(newStr
);
把数字转成中文
var str
= "20191214";
var ary
= ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖", "万", "仟"];
var newStr
= str
.replace(/\d/g, function (a
) {
return ary
[a
]
})
console
.log(newStr
);
把下面时间格式化成2019年12月24日16时02分30秒
var str
= "2019-12-24 16:02:30";
var ary
= ["年", "月", "日", "时", "分", "秒"];
var newStr
= "";
var i
= 0;
str
.replace(/\d+/g, function (a
, b
) {
newStr
+= a
+ ary
[i
++];
})
console
.log(newStr
);
加千分符,给下面的数字加’,'使其成为13,234,567,753,224
var str
= "13234567753224";
var newStr
= str
.replace(/^(\d{1,3})((\d{3})+)$/, function (a
, b
, c
, ) {
console
.log(arguments
);
var part2
= c
.replace(/\d{3}/g, function (d
,e
) {
return ","+d
})
return b
+part2
})
console
.log(newStr
);
var str
="1234657753224";
var i
=0;
var newStr
=str
.replace(/\d/g,function(a
,b
){
debugger;
if((str
.length
-b
-1)%3===0&&str
.length
-1!=b
){
return a
+","
}else{
return a
}
})
console
.log(newStr
);
str
.toLocaleString('en-US');
结束语
感觉还可以的可以点赞、收藏加关注呦~推荐三款正则可视化工具