• 使用正则表达式判断连对的介绍


    关键字:正则反向引用连对捕获匹配

    问题:

    一个群友在群里问了一个正则表达式的问题:

    正则表达式 AABBCC,6位数只能是数据和字母应该怎么写?形如 AABBCC AA22UU这种连对。

    大多数人可能和我一样,不经常使用正则表达式,因此在一看到这个题的时候可能一下子有一些想法,但是写起来验证的时候就比较痛苦了。起因是负责的正则表达式,要考虑的东西比较多,有时候改动一个地方,会影响前边已经验证通过的地方(后边会提到)。

    解析

    可以看到,题目中要求是3连续2个相同字母或数字,如此一分析之后,答案已经呼之欲出了。
    3组 大写字母或数组比较好理解,大部分人的难点主要在 连续两个相同的字符 这一点上。

    直接先公布答案吧:

    /^(([A-Z0-9])\2){3}$/gm

    那么我们来分析一下,如何匹配到连续两个相同的字符?分两步走:

    1. 捕获:
      我们应该是要确定第二个字符要与第一个字符相同,那么我们就需要捕获第一个字符,正则中关于捕获的介绍如下:

      (pattern)   匹配 pattern 并捕获该匹配的子表达式。可以使用 $0…$9 属性从结果"匹配"集合中检索捕获的匹配。若要匹配括号字符 ( ),请使用"(“或者”)"。

    2. 反向引用:
      我们需要第二个字符与第一个字符相同,那么我就就需要在第二个字符的位置,引用第一个字符的值,那么我们已经捕获了第一个字符,怎么引用呢?

      \num  匹配 num,此处的 num 是一个正整数。到捕获匹配的反向引用。例如,"(.)\1"匹配两个连续的相同字符。

      \n 表示对于一个正则表达式,引用这个表达式中捕获组的第n组的数据

    ok,那么如合匹配两个连续的相同字符呢? ([A-Z0-9])\1

    • ([A-Z0-9])表示圆括号捕获了一个字符,是 大写字母或数字
    • \1 表示引用捕获了的第一个字符,重复一次

    然后再对我们上边的连续两个字符的正则表达式整体 重复3次且只能有3次 >>>> (([A-Z0-9])\1){3}

    BUT!!! !!! 当你验证的时候,你就会发现这是一个错误的正则表达式:
    错误的正则验证
    原因是:当我们将我们的 连续两个字符的正则表达式 当做一个整体加上圆括号的时候,这个表达式本身也是一个捕获组了,因为这个括号在外部,所以它成了第一个捕获组,那么内部的 \1 ==> ([A-Z0-9])\1 这与我们的预期就不一致了,这个时候我们 需要的 ([A-Z0-9]) 就变成了 第2组

    因此正确的写法是 (([A-Z0-9])\2){3}

    这个写法就正确了~~~~
    在这里插入图片描述

    但是!!!! 又不完全对

    在这里插入图片描述
    我们可以看到,这个表达式对于,只要是连对的无限长的字符串都可以匹配,这与我们的预期不符,我们只需要 3组 只有3组这样的字符串才是符合的。

    首尾限定符!!!

    ^  匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与"\n"或"\r"之后的位置匹配。

    $  匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与"\n"或"\r"之前的位置匹配。

    我们只需要将正则表达式盖成如此即可:/^(([A-Z0-9])\2){3}$/gm
    表示我们需要对于一个字符串,从头到尾只需要3组 两个相同的字符。

    我们可以在这个网站regex101中编写并检查我们的正则表达式,它同时会给你一些你的正则表达式的解析过程,有利于你高效准确的编写正则表达式。
    在这里插入图片描述

    出个题: 如果用代码去实现一个字符串的是否符合我们的要求,你会怎么去完成呢?

  • 相关阅读:
    【Python人工智能】Python全栈体系(十七)
    一文详解用 eBPF 观测 HTTP
    技术分享 | orchestrator--运维--配置集群自动切换&测试
    计算机组成原理——第一章
    WebService 接口的发布调试与调用
    【运维】在 Docker 容器中指定 UTF-8 编码:方法与技巧
    小Z的拼数游戏c++(求 解)
    第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(沈阳),签到题4题
    互联网摸鱼日报(2022-10-20)
    快速排序全面详解
  • 原文地址:https://blog.csdn.net/qq_23401185/article/details/126250111