正则表达式

正则表达式

正则表达式(Regular Expression,在代码中常简写为regex、regexp或RE)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。

1.什么是正则表达式?

正则表达式是由一个字符序列形成的搜索模式。

当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。

正则表达式可以是一个简单的字符,或一个更复杂的模式。

正则表达式可用于所有文本搜索和文本替换的操作。

2.正则表达式的创建

  • 字面量(直接量)
  • 构建函数

3.字符分类

普通字符 字母、数字、下划线、汉字、没有特殊含义的符号 (,;!@等)

特殊字符 : 将特殊字符转义成普通字符

模式修饰符 i:忽略大小写 m:多行匹配 g :全局匹配 字面量创建正则时,模式修饰符写在一对正斜线后

4.正则表达式实例方法

  • exec

    如果匹配到,返回值是一个result数组:

    [匹配的内容,index: 在str中匹配的起始位置,input: 参数字符串,groups: undefined]

    否则返回null

    注意点:

    1)如果正则表达式中有修饰符"g",这时,在正则表达式的实例reg中会维护lastIndex属性,记录下一次开始的位置,当第二次执行exec的时候,从lastIndex开始检索。
    2)如果正则表达式中没有修饰符"g",不会维护lastIndex属性,每次执行从开始位置检索

  • test

    用来测试待检测的字符串中是否有可以匹配到正则表达式的字符串,如果有返回true,否则返回false

    注意点:

    1)如果正则表达式中有修饰符"g",这时,在reg中会维护lastIndex属性,记录下一次开始的位置,当第二次执行test的时候,从lastIndex开始检索。
    2)如果正则表达式中没有修饰符"g",不会维护lastIndex属性,每次执行从开始位置检索

  • toString/toLocaleString

    把正则表达式的内容转化成字面量形式字符串/有本地特色的字符串(JS中没效果

  • valueOf

    返回正则表达式本身

5.正则表达式实例属性

  • lastIndex

    当没设置全局匹配时,该属性值始终为0

    设置了全局匹配时,每执行一次exec/test来匹配,lastIndex就会移向匹配到的字符串的下一个位置,当指向的位置后没有可以再次匹配的字符串时,下一次执行exec返回null,test执行返回false,然后lastIndex归零,从字符串的开头重新匹配一轮

    可以理解成,每次正则查找的起点就是lastIndex

  • ignoreCase global multiline

    判断正则表达式中是否有忽略大小写、全局匹配、多行匹配三个模式修饰符

  • source 类似于toString

    返回字面量形式的正则表达式

6.正则表达式语法-元字符

  • 直接量字符

    字母和数字字符->自身 \o->null字符 \t->制表符 \n->换行符 \v->垂直制表符 \f-> 换页符 \r->回车符

  • 字符合集 方括号用于查找某个范围内的字符

  [abc]  查找abc之间的任何字符
  [0-9]  查找任何0-9的数字
  [^xyz] 取反  匹配任意不在括号内的字符	 
  • 边界符

^ 匹配输入开始 $ 匹配输入结尾

如果^和$在一起 表示必须是精确匹配

  • 字符集与"^“和”$"一起使用

  • \b 匹配一个零宽单词边界

  • \B 匹配一个零宽非单词边界

  • 字符类

    1."." 除换行符\n和回车符之外的任何单个字符
    
    2.\d  匹配一个数字字符  等效于[0-9]
    3.\D  等效于[^0-9]
    
    4.\w 匹配包括下划线的任何单个字符,包括A-Z,a-z,0-9和下划线,等效于[a-zA-Z0-9_]
    5.\W [^a-zA-Z0-9_] 
    
    6.\s  匹配任何Unicode空白字符,包括空格、制表符、换页符等等  等效于[\f\t\n\r]
    7.\S  等效于[^\f\t\n\r]
    
  • 数量词

X*  匹配前面的模式 X->0或多次    等效于{0,}
X+  匹配前面的模式X->1或多次    等价于{1,}
X?  匹配前面的模式 X->0或1次    等价于{0,1}
X{n} n为非负整数  前面的模式x重复出现n次时匹配
X{n,} n为非负整数  前面的模式x重复出现至少n次时匹配
X{n,m} n为非负整数  前面的模式x重复出现至少n次,至多m次时匹配

7. 重复方式

  1. 贪婪模式 尽可能多的匹配 当匹配剩余的字符串 还会继续尝试新的匹配 直到匹配不到为止,为默认模式

  2. 非贪婪模式 尽可能少的匹配 直到匹配不到为止

    ​ 使用方法: 在量词后面加上?

8.选择,分组,引用

  • 选择 字符"|"用于分隔供选择的字符, 选择项的尝试匹配次序时从左到右,直到发现匹配项 如果左边的选择项匹配,就忽略右边的匹配项,即使能产生更好的匹配

  • 分组 用圆括号包裹成一个小整体成为分组

    候选 一个分组中, 可以有多个候选表达式,用 | 分 隔开

    捕获与引用 被正则表达式匹配(捕获)到的字符串会被暂存起来,其中由分组捕获的串会从1开始编号

    var reg = /(\d{4})-(\d{2})-(\d{2})/
    
    var date = '2021-08-29'
    
    reg.test(date)
    // 捕获之前要先test/exec
    console.log(RegExp.$1); //2021
    console.log(RegExp.$2); //08
    console.log(RegExp.$3); //29
    

    嵌套分组的捕获 嵌套分组的捕获顺序规则是以左括号出现的顺序进行捕获

  • 引用 正则表达式里也能进行引用 ,称为反向引用

    ​ 注意:如果编号越界了会被当作普通的表达式

9.String对正则表达式的支持

  • search 匹配字符串 返回匹配字符串第一次出现的位置,否则返回-1 类似于exec

  • match 匹配字符串 返回一个数组 数组包括字符串内容、位置

    ​ 如果正则设置全局匹配 一次性返回所有符合正则表达式的字符串数组

    ​ 如果其中添加了分组,返回符合要求的字符串以及分组的一个数组,但如果同时开启全局匹配则不会在数组中添加分组内容

  • split 以某种形式分隔字符串 split(‘分隔符’) 将字符串转换为数组

  • replace 满足正则表达式条件的内容将被替换 replace(正则表达式,要替换的内容)

10.前瞻表达式

在正则表达式当中有个东西叫做前瞻,有的管它叫零宽断言:

表达式名称描述
(?=exp)正向前瞻匹配后面满足表达式exp的位置
(?!exp)负向前瞻匹配后面不满足表达式exp的位置

由于 JS 原生不支持后瞻,所以这里就不研究它了。我们来看看前瞻的作用:

var str = 'Hello, Hi, I am Hilary.';
// 后面一定要匹配什么
var reg = /H(?=i)/g;
var newStr = str.replace(reg, "T");
console.log(newStr);//Hello, Ti, I am Tilary.

在这个DEMO中我们可以看出正向前瞻的作用,同样是字符"H",但是只匹配"H"后面紧跟"i"的"H"。就相当于有一家公司reg,这时候有多名"H"人员前来应聘,但是reg公司提出了一个硬条件是必须掌握"i"这项技能,所以"Hello"就自然的被淘汰掉了。

那么负向前瞻呢?道理是相同的:

var str = 'Hello, Hi, I am Hilary.';
// 后面一定不要匹配什么
var reg = /H(?!i)/g;
var newStr = str.replace(reg, "T");
console.log(newStr);//Tello, Hi, I am Hilary.

在这个DEMO中,我们把之前的正向前瞻换成了负向前瞻。这个正则的意思就是,匹配"H",且后面不能跟着一个"i"。这时候"Hello"就可以成功的应聘了,因为reg公司修改了他们的招聘条件,他们说"i"这门技术会有损公司的企业文化,所以我们不要了。

案例
1.匹配QQ号
// 不能以数字0开始,只能由数字组成,长度为5-11位
var reg = /^[1-9]\d{4,10}$/;
var str1 = "12311111111";
var result1 = reg.exec(str1);
console.log(result1);
2.匹配身份证号
// 不能以数字0开头,只能由数字组成,最后一位可能是x,X,数字
var reg = /^[1-9]\d{16}[xX\d]$/;
var str = "456337189654326541";
var result = reg.exec(str);
console.log(result);
3.验证是否为11位有效手机号码 (以1为开头,第二位为3,4,5,7,8中的任意一位,最后以0-9的9个整数结尾
var reg = /^[1][34578]\d{9}$/;
var str = "13000785566";
console.log(reg.test(str));  //true
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值