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

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

问题:

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

正则表达式 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中编写并检查我们的正则表达式,它同时会给你一些你的正则表达式的解析过程,有利于你高效准确的编写正则表达式。
在这里插入图片描述

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值