什么是正则?
正则就是:定义字符串出现规则的表达式。
何时使用?
字符串的切割、替换、验证以及Python爬虫时。
JS中如何使用正则?
语法:var reg=/正则规则/;
一、正则的基础
1、限定符
?限定符
表示?前面的一个字符可以出现0次或1次。
r如:ab?c,意思是匹配出现0次b或者1次b的字符串。
*限定符
表示*前面的一个字符可以出现0次或者多次。
如:ab*c,表示可以匹配出现0次,或者多次c的字符串。
+ 限定符
表示+前面的一个字符可以出现1次或者多次。
如:ab+c,表示可以匹配出现一次或者多次b的字符串。
{}限定符
{}可以指定{}前的字符出现的次数。
传入一个参数就是必须出现多少次。
也可以传入一个范围,比如{2,6},就是允许{}前面的字符出现2-6次。如:ab{2,6}c
如果希望出现两次或者指定次数以上,可以省略第二个参数,但是逗号不可以省略。如:ab{2,}c
2、备选字符集
一个备选字符集,规定一位字符可能出现的情况。
何时使用?
只要关键字有多种情况。
如何使用:/[备选字符集]/
注意:
1)、一个中括号只能管一个字符;
2)、问题:正则只要匹配到满足规则的部分后,就不会管其余部分是否匹配。
解决:使用^匹配行首,$匹配行尾
特殊情况:
1)、如果备选字符集中有部分是unicode号/ASCII码是连续的,则可以用-省略中间部分:
/[0-9]/表示从0到9
/[a-z]/表示从小写a到小写z
/[A-Z]/表示从大写A到大写Z
2)、取反,除了xxx之外,其他都可以
[^xxx],表示除了xxx,都可以,范围太广,不推荐
3、匹配指定开头和指定结尾的字符串
^:以xxxxx开头
$:以xxxx结尾
如果同时使用了,前加^后加$,从头到尾完全匹配。只要是做验证,必须这么写。
其中,如果^用在了备选字符集[]中,表示除了备选字符集都可以,相当于取反。
4、预定义字符集
预定义字符集:提前定翼腭的一些常用的字符集
1)、一个数字:\d
2)、一个非数字:\D
3)、一位数字、字母、下划线:\w
4)、一位非数字、非字母、非下划线:\W
5)、一位空白字符:\s,包括空格、制表符、换行
6)、一位非空白字符:\S
7)、一位除了换行以外的任意字符:.(这里有个点)
建议:开发时优先使用预定义字符集,预定义字符集满足不了再用备选字符集补充。
5、选择(正则中的或运算)和分组
选择:可以在多个条件中选择—个。
规则1|规则2
分组:一个()表示一个分组,选择和分组—般来说都是需要搭配 | 使用的,即添加了子规则。
(规则1|规则2)
6、预判
在正式匹配正则表达式之前,先预读整个字符串,进行初步匹配,如果预判都未通过,则不再验证。也就是只有通过了预判,才会去验证是否符合程序员设定的真正规则。
公式:(?!这里写预判+$)
比如:
1、/^(?![0-9]+$)$/ : 不能全由数字组成,可能有大写字母、小写字母、汉字、特殊符号、日文、韩文...
2、/^(?![A-Za-z]+$)$/ : 不能全由大写组成,也不能全由小写组成,也不能由大写和小写的组合组成,可能有数字、汉字、特殊符号、日文、韩文...
使用场景:
一般用于密码强度验证、身份证、手机号验证等地方。
预判练习:
1)、4-6位密码,可以输入字母数字,但是必须要有一位大写和一位数字的组合
var reg=/^(?![0-9a-z]+$)(?![A-Za-z]+$)[0-9A-Za-z]{4,6}$/
2)、4-6位密码,可以输入字母数字,但是必须要是3者的组合
var reg=/^(?![0-9a-z]+$)(?![A-Za-z]+$)(?![0-9A-Z]+$)[a-zA-Z0-9]{4,6}$/;
7、后缀g和i
在JS中,可以添加后缀来表示某一范围。
如:
var reg=/[a-z]/g
g后缀表示的是全局(global)匹配。
var reg=/[a-z]/i
i后缀表示忽略大小写。
8、贪婪与懒惰匹配
正则默认是贪婪匹配,也就是会尽可能多的去匹配字符串。
如:
<span><b>This is a simple text</b></span>
使用的正则:
<.+>,但这样会把上面的所有字符都匹配上,但我们的本意是只匹配标签。
解决:<.+?>,把贪婪匹配改成懒惰匹配,就只匹配标签了。
二、字符串中支持正则的方法
在字符串的方法中,支持正则的方法有:split和replace。
1、切割
var arr=str.split("固定切割符"/RegExp)
当你的字符串中使用不同的字符来分隔字符时,就可以使用正则进行切割,返回数组。
2、替换(难点)
1)、基础替换法:
str=str.replace(/正则表达式/g,"新内容")
注意:替换时,不要加^和$,我们不需要完全匹配,只需要找到关键字替换而已
问题:替换的东西,只能替换成固定的东西
2)、高级替换法:
str=str.replace(/正则表达式/g,function(key,index,str){
console.log(key) // 正则匹配到的内容
console.log(index) //当前次正则匹配到的关键字的下标
console.log(str) //原文本身
return key.length;
})
通过传入回调函数,获取正则当前次匹配到的信息(匹配到多少个就会执行多少次),可以判断长度,进而进行不同的替换。
3)、格式化:如果替换时,正则中带有分组,即(),那么回调函数中会有更多的参数
var str="500234200005289999"
var reg=/\d{6}(\d{4})(\d{2})(\d{2})\d{4}/;
str=str.replace(reg,function(key,a,b,c,index,str){
console.log(key) // 正则匹配到的内容
console.log(a) //第一个分组匹配到的内容
console.log(b) //第二个分组匹配到的内容
console.log(c) //第三个分组匹配到的内容
...
console.log(index) //当前次正则匹配到的关键字的下标
console.log(str) //原文本身
return a+"年"+b+"月"+c+"日"
})
有几个分组,就会在高级替换的基础上多上几个参数,多出来的参数位置,在key之后,index之前。
原文链接:https://blog.csdn.net/txl2498459886/article/details/126669189