【正则表达式】 正则表达式的分组和引用
🌈 个人主页:(时光煮雨)
🔥 高质量专栏:vulnhub靶机渗透测试
👈 希望得到您的订阅和支持~
💡 创作高质量博文(平均质量分95+),分享更多关于网络安全、Python领域的优质内容!(希望得到您的关注~)
🌵目录🌵
- 前言
- 🍱一、基本语法
- 🍘二、分组类型
-
- 🍙2.1. 捕获分组(Capturing Group)
- 🍚2.2. 非捕获分组(Non-capturing Group)
- 🍛2.3. 命名分组(Named Capturing Group)
- 🍜三、分组引用
-
- 🍝3.1. 反向引用(Backreference)
- 🍠3.2. 命名反向引用
- 🍢3.3. 替换引用
- 🍣四、分组的高级应用
-
- 🍤4.1. 条件匹配
- 🍥4.2. 平衡组(高级特性)
- 🥮五、常见问题与陷阱
- 🍡六、练习挑战
- 🥟七、总结要点
- 🤝 期待与你共同进步
- 📚 参考文档
前言
在正则表达式中,分组(Grouping)允许我们将多个字符视为一个整体单元,就像数学中的括号一样。分组主要有两个作用:
- 将多个字符作为一个整体:可以对这个整体应用量词(如 *、+、?、{n})
- 捕获匹配的内容:可以在后续引用或提取这部分匹配的内容
🍱一、基本语法
使用圆括号 () 来创建分组:
(表达式)
例如,(ab)+ 可以匹配 “ab”、“abab”、“ababab” 等,但不能匹配 “a” 或 “b”。
🍘二、分组类型
正则表达式中有几种不同类型的分组:
🍙2.1. 捕获分组(Capturing Group)
最常见的分组形式,会捕获匹配的内容并分配一个编号(从1开始)。
(\d{4})-(\d{2})-(\d{2}) # 匹配日期格式 YYYY-MM-DD
这个表达式会创建3个分组:
- 分组1:4位数字的年份
- 分组2:2位数字的月份
- 分组3:2位数字的日期
🍚2.2. 非捕获分组(Non-capturing Group)
使用 (?:表达式) 语法,表示只分组但不捕获。
(?:Mr|Ms|Mrs)\. (\w+) # 匹配 "Mr. Smith" 但只捕获 "Smith"
🍛2.3. 命名分组(Named Capturing Group)
为分组指定名称,提高可读性(不同语言语法可能不同)。
Python 示例:
(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})
JavaScript 示例:
(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})
🍜三、分组引用
分组最强大的功能之一是可以在正则表达式内部或外部引用已匹配的内容。
🍝3.1. 反向引用(Backreference)
在正则表达式内部引用前面的分组,使用 \数字 语法:
(\w+) \1 # 匹配重复的单词,如 "hello hello"
这个模式会匹配两个相同的单词,中间用空格分隔。
🍠3.2. 命名反向引用
对于命名分组,可以使用名称来引用:
(?P<word>\w+) (?P=word) # Python 语法
\k<word> # JavaScript 语法
🍢3.3. 替换引用
在替换操作中引用分组内容:
Python 示例:
import re
text = "2023-05-15"
new_text = re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\2/\3/\1', text)
# 结果: "05/15/2023"
JavaScript 示例:
let text = "2023-05-15";
let newText = text.replace