正则的基础与使用

目录

一、正则的基础

1、限定符

?限定符

*限定符

+ 限定符

{}限定符

2、备选字符集

3、匹配指定开头和指定结尾的字符串

4、预定义字符集

5、选择(正则中的或运算)和分组

6、预判

预判练习:

7、后缀g和i

8、贪婪与懒惰匹配

二、字符串中支持正则的方法

1、切割

2、替换(难点)


什么是正则?

        正则就是:定义字符串出现规则的表达式。

何时使用?

        字符串的切割、替换、验证以及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之前。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值