0
点赞
收藏
分享

微信扫一扫

#yyds干货盘点# 字符限定与分组

大家好,我是洋哥。今天给大家介绍一下字符限定与分组。

字符限定与分组

字符限定

字符限定——限定符

提出问题:匹配一个连续出现的字符,如 6个连续出现的数字“458925”。

解决方案1:正则对象/\d\d\d\d\d\d/gi。

 

存在的问题:重复出现的“\d”既不便于阅读,书写又繁琐。

解决方案2:使用限定符(?、+、*、{ })完成某个字符连续出现的匹配。正则对象/\d{6}/gi。

snipaste_20220219_142912.png

 

字符限定——贪婪与懒惰匹配

当点字符(.)和限定符连用时,可以实现匹配指定数量范围的任意字符。

  • 举例:“^hello.*world$”。
  • 说明:可匹配从hello开始到world结束,中间包含零个或多个任意字符的字符串。

 

正则在实现指定数量范围的任意字符匹配时,支持贪婪匹配和惰性匹配两种方式。

  • 所谓贪婪表示匹配尽可能多的字符,而惰性表示匹配尽可能少的字符。在默认情况下,是贪婪匹配。
  • 若想要实现惰性匹配,需在上一个限定符的后面加上“?”符号。

snipaste_20220219_153838.png

 

括号字符

在正则表达式中,被括号字符“()”括起来的内容,称之为“子表达式”。

snipaste_20220219_154030.png

作用

snipaste_20220219_154119.png

小括号实现了匹配catch和cater,而如果不使用小括号,则变成了catch和er

snipaste_20220219_154149.png

未分组时,表示匹配2个c字符;而分组后,表示匹配2个“bc”字符串。

 

 

捕获与非捕获

捕获:将子表达式匹配到的内容存储到系统的缓存区的过程。

非捕获:不将子表达式的匹配内容存放到系统的缓存中,使用(?:x)实现。
 
snipaste_20220219_154256.png

 

String对象的replace()方法,可直接利用$n(n是大于0的正整数)获取捕获内容,完成对子表达式捕获的内容进行替换的操作。

snipaste_20220219_154328.png

  • 第1个参数为正则表达式,用于与str字符串进行匹配,将符合规则的内容利用第2个参数设置的内容进行替换。
  • $2表示reg正则表达式中第2个子表达式被捕获的内容“Capture”。
  • $1表示第1个子表达式被捕获的内容“Regular”。
  • 返回值是替换后的新字符串,因此,并不会修改原字符串的内容。

 

 

可以使用”(?:x)”的方式实现非捕获匹配

snipaste_20220219_154449.png

反向引用

在编写正则表达式时,若要在正则表达式中,获取存放在缓存区内的子表达式的捕获内容,则可以使用“\n”(n是大于0的正整数)的方式引用,这个过程就是“反向引用”。

  •  “\1”表示第1个子表达式的捕获内容。
  • “\2”表示第2个子表达式的捕获内容,以此类推。
     
    snipaste_20220219_154649.png

  • “\d”用于匹配0~9之间的任意一个数字。
  • 为其添加圆括号“()”后,即可通过反向引用获取捕获的内容。
  • 因此,最后的匹配结果为333和666。

 

 

零宽断言

零宽断言:指的是一种零宽度的子表达式匹配,用于查找子表达式匹配的内容之前或之后是否含有特定的字符集。

分类:分为正向预查和反向预查,但是在JavaScript中仅支持正向预查,即匹配含有或不含有捕获内容之前的数据,匹配的结果中不含捕获的内容。

snipaste_20220219_154810.png

 

正则运算符优先级

正则表达式中的运算符有很多。在实际应用时,各种运算符会遵循优先级顺序进行匹配。正则表达式中常用运算符优先级,由高到低的顺序如下表。
 
snipaste_20220219_154903.png

 

【案例】内容查找与替换

snipaste_20220219_155028.png

代码实现思路:

  • 编写HTML,定义两个文本域,一个用于用户输入,另一个用于显示按照要求替换后的过滤内容。
  • 用户输入只要含有bad和任意中文字符,就利用*替换。
  • 查找并替换的内容规则:/(bad)|[\u4e00-\u9fa5]/gi。

代码实现

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>内容查找与替换</title>
    <style>
    div{float:left;}
    input{margin:0 20px;}
    </style>
    </head>
    <body>
    <div>过滤前内容:<br>
    <textarea id="pre" rows="10" cols="40"></textarea>
    <input id="btn" type="button" value="过滤">
    </div>
    <div>过滤后内容:<br>
    <textarea id="res" rows="10" cols="40"></textarea>
    </div>
    <script>
    document.getElementById('btn').onclick = function () {
    // 定义查找并需要替换的内容规则,[\u4e00-\u9fa5]表示匹配任意中文字符
    var reg = /(bad)|[\u4e00-\u9fa5]/gi;
    var str = document.getElementById('pre').value;
    var newstr = str.replace(reg, '*');
    document.getElementById('res').innerHTML = newstr;
    };
    </script>
    </body>
    </html>
举报

相关推荐

0 条评论