广告位联系
返回顶部
分享到

正则表达式分组与引用的使用介绍

正则表达式 来源:转载 作者:秩名 发布时间:2021-07-27 07:11:36 人浏览
摘要

今天我们来讲下正则中的分组与引用,我们在实战环节就已经用到分组这个功能了,回顾下 IPv4 地址的正则表达式: ^([1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.(0|[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$ 可以简写下: ^(条件1)(\.(条件2))

今天我们来讲下正则中的分组与引用,我们在实战环节就已经用到分组这个功能了,回顾下 IPv4 地址的正则表达式:

^([1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.(0|[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$

可以简写下:

 

^(条件1)(\.(条件2)){3}$

可以看到在表达式中出现了几对括号,为什么要用括号把表达式括起来,这些括号有什么作用呢,我们一起来看下。

1.分组与编号

括号在正则中可以用于分组,被括号括起来的部分可以称为子表达式,会被保存成一个子组。

举个栗子,有一个日期时间 2021-06-01 13:14:21,我们想要提取出其中的日期和时间,就要用括号对日期和时间进行分组,如下图所示:

分组与编号

可以看到图中有两个分组,日期分组是第1个,时间分组是第2个,我们以左括号的位置,来表示分组的标号,从1开始,第几个左括号,就是第几个分组。

上面的栗子,我们再分的细一点,我们要分别提取其中的年、月、日,时、分、秒,如下图所示:

括号嵌套

可以看到日期的分组编号是 1,时间分组的编号是 5,年月日的分组编号分别是 2,3,4,时分秒的分组编号分别是 6,7,8。

2.不保存子组

分组是有一定的性能消耗的,在有些情况下,我们只是单纯的想要分组,后续并不想使用它,就可以在左括号的后面加上 ?: 表示不保存子组。

比如,需要是使用正则匹配目标字符串中的15位或18位数字:

功能 正则 示例
保存子组 (正则) \d{15}(\d{3})?
不保存子组 (?:正则) \d{15}(?:\d{3})?


保存子组

不保存子组

我们之前讲过的 IPv4 正则表示就可以优化下:

^(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:0|[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$

IPv4地址正则匹配

3.分组引用

上面讲完了分组,我们来看下如何来引用分组,大部分语言都是用 反斜杠 + 编号 的方式,个别的比如 JavaScript语言,使用的是 美元符号 + 编号 的方式:

编程语言 查找时引用方式 替换时引用方式
Python \number 如 \1 \number 如 \1
Go 官方包不支持 官方包不支持
Java \number 如 \1 $number 如 $1
JavaScript $number 如 $1 $number 如 $1
PHP \number 如 \1 \number 如 \1
Ruby \number 如 \1 \number 如 \1

4.查找与替换

查找

到这里我们已经学完了分组与引用的知识,一起来实践下,有这样一个需求,在一个目标字符串中,查找两个重复出现的单词。

还没有学到单词边界,我们先用 \w{2,} 来表示出现的单词,重复的单词就是 (\w{2,} \1),看下结果:

分组查找

替换

上面的内容,我们讲到了日期的分组,来替换下:

分组替换

对应的 Python 代码如下:

import re

test_str = "2021-06-01 13:14:21"
regex = r"((\d{4})-(\d{2})-(\d{2})) ((\d{2}):(\d{2}):(\d{2}))"
subst = r"\2年\3月\4日 \6时\7分\8秒"
result = re.sub(regex, subst, test_str)
print(result)

输出:2021年06月01日 13时14分21秒

5.在文本编辑器中使用

正则表达式不仅可以在代码中使用,在文本编辑器中也是比较常用的,以 Sublime Text 3 举例来讲下正则的查找与替换,学完之后,会让你的工作事半功倍。

点击 Find -> Find 选项,或者使用快捷键 Ctrl + F 可以唤起查找功能:

Sublime Text 查找.png

点击 Find -> Replace 选项,或者使用快捷键 Ctrl + H 可以唤起替换功能:

Sublime Text 替换.png

查找

我们来实现一个查找邮箱的功能,此处的邮件正则只是简单演示使用,当点击 Find All 按钮后,可以看到邮箱都被找到了,此时如果点击 Ctrl + C 复制,可以把找到的邮箱单独粘贴出来:

查找演示

替换

演示下我们上面讲过的替换例子:

替换演示

怎么样,是不是很方便,几乎所有的主流编辑器都是支持正则的,学会了正则,对我们的工作帮助还是挺大的。

6.写在最后

最后在总结下上面讲到的内容:

思维导图


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/kong_gu_you_lan/article/details/118888392
相关文章
  • 正则表达式校验日期时间格式的方法
    日期部分校验 概念 首先,我们先了解2个概念: 1、合法的日期范围: DateTime值类型表示值范围在公元(基督纪元)0001 年 1 月 1 日午夜 12
  • 如何使用正则表达式对输入数字进行匹配

    如何使用正则表达式对输入数字进行匹配
    最近有一个区间范围限制,一般255数字以下的都能在网上薅到,但是需要弄一个int16、int32、int64范围的输入限制......在网上逛了很久都没找
  • 最实用的正则表达式的整理

    最实用的正则表达式的整理
    想要白嫖正则是吧?本篇就一次给你个够!先冲 100 个!(如果还觉得不够就评论反馈后再加,本篇持续更新加码!!) 点赞再看,养成好
  • 停止编写API函数原因介绍
    RESTFUL API 通常提供在不同实体上执行增删改查(CRUD)操作的一组接口。我们通常在我们的前端项目中为这些每一个接口提供一个函数,这些
  • 正则表达式的基本语法汇总介绍

    正则表达式的基本语法汇总介绍
    1.正则表达式的基本语法 1.1两个特殊符号 ^ 和 $ ^ 正则表达式的起始符 ^tom 表示所有以tom开头的字符串 $ 正则表达式的结束符 lucy$ 表示所有
  • 正则表达式基础语法以及应用介绍

    正则表达式基础语法以及应用介绍
    一、正则表达式 1、基本介绍 ? 概述 一个正则表达式,就是用某种模式去匹配字符串的一个公式。很多人因为它们看上去比较古怪而且复杂
  • 正则表达式从HTML中匹配img标签的图片地址

    正则表达式从HTML中匹配img标签的图片地址
    前言 有玩过爬虫的人应该都有过在又臭又长的HTML中找寻信息的经历,虽然有各种工具和各种框架可以辅助查找,但是解析HTML的规则也是人
  • Snort中pcre和正则表达式的使用介绍

    Snort中pcre和正则表达式的使用介绍
    1. 题目描述 If snort see two packets in a TCP flow with first packet has login or Initial in payload, destination port is 3399;and second packet has a IPv4Address:Portstring(E.g
  • 在nest.js中通过正则表达式正确设置验证的方法

    在nest.js中通过正则表达式正确设置验证的方法
    下面看下nest.js正则表达式设置验证的方法,代码如下所示: 1 2 3 4 import { IsNotEmpty, Length, Matches, Max, Min } from class-validator; const phoneReg = /^1(3
  • shell脚本中的正则表达式介绍
    正则表达式的概念及特点: 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计