正则升级起别名,妈妈再也不用担心我找不到正则匹配内容索引了

「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战」。

前言

  • 之前一篇我们简单介绍了正则表达式可以满足我们日常需求的规则验证。正则除了验证以外还有功能是匹配查找。实际上我们上一篇在验证域名的时候就是通过匹配去做的。今天我们来看看如何匹配查找我们的关键词行为

匹配查找

  • (.*)\*\{(\d+)\} ,有了上文的基础加上我们对正则的认识,这段正则应该很好理解,该正则的意思就是匹配所有已*{数字}结尾的内容。
  • 比如我们可以匹配到zxhtom*{3},这种内容就是符合我们该正则的规则的。
Pattern compile = Pattern.compile("(.*)\*\{(\d+)\}");
Matcher matcher = compile.matcher("zxhtom*{3}");
if (matcher.find()) {
    //DO SOMETHINGS
}
复制代码
  • 如上就是我们匹配通过后就可以做相关业务了。

获取内容

  • 但是如果我的业务依赖于里面的数字,那我该如何获取这串数字呢?这个时候在matcher中就会按照()进行分隔内容。首先整体的内容会优先存放下来。我们的正则中数字在第二个括号中。所以这里我们应该获取匹配列表中第三个元素
Pattern compile = Pattern.compile("(.*)\*\{(\d+)\}");
        Matcher matcher = compile.matcher("zxhtom*{3}");
        if (matcher.find()) {
            System.out.println(matcher.group(2));
        }
复制代码
  • 最終我們就可以输出我们需要的3 。 这个功能还是很强大并且很实用的,就比如我们验证姓名的时候验证玩需要获取姓名对应的姓氏(默认第一个字是姓氏).这个时候我们直接在匹配列表中获取就行了。

别名

  • 上面虽然可以获取到匹配内容中我们想要的相关数据,但是你也发现了我们得时刻注意正则中的括号的位置。这样子如果后期进行扩展了新增或者减少了括号,或者移动了括号的位置我们对应的group索引都需要修改下,还好正则给我们提供了起别名的操作。
Pattern compile = Pattern.compile("(.*)\*\{(?<c>\d+)\}");
Matcher matcher = compile.matcher("zxhtom*{3}");
if (matcher.find()) {
    System.out.println(matcher.group("c"));
}
复制代码
  • 我们只需要在对应的括号内新增?<name>的形式就可以了。这个时候我们只需要去获取名字叫c的匹配内容。无需关心他在正则中的位置了。