正则表达式笔记

基础

  • 精准匹配:
    • \d:数字
    • \w:字符
    • \r:回车符
    • \f:换页符
    • \n:换行符
    • \t:制表符
    • \s :任何空白字符,包括空格、制表符、换行符等
  • 模糊匹配:
    • .:单个任意字符
  • 可变匹配:
    • *:任意个字符
    • +:至少一个字符
    • ?:0或1个字符
    • {}{n}表示n个字符,用{n,m}表示n-m个字符

进阶

  • []:方括号中的符号需要转义,多个条件可以直接连接,或
    • 0-9
    • a-z
    • A-Z
    • \_
  • |:表示或,A|B可以匹配A或B
  • ^:表示行的开头,^\d表示必须以数字开头
  • $:表示行的结束,\d$表示必须以数字结束

捕获组

一、捕获组的基本概念

捕获组是正则表达式中用圆括号 ()括起来的部分,它有两个主要功能:

  1. 将多个字符作为一个整体进行匹配
  2. 记住匹配的内容以便后续引用

二、捕获组的基本使用方法

  1. 创建捕获组
    1
    (\d{4})-(\d{2})-(\d{2})

这个正则表达式匹配日期格式(如2023-05-20),并创建了3个捕获组

  • 第1组:4位数字的年份
  • 第2组:2位数字的月份
  • 第3组:2位数字的日期
  1. 引用捕获组
    在正则表达式内部引用(反向引用)
1
(\w+) \1

这个表达式匹配重复的单词,如”hello hello”或”test test”,其中\1引用了第一个捕获组匹配的内容

在替换操作中引用

1
2
替换前: (\d{4})-(\d{2})-(\d{2})
替换为: $3/$2/$1

这将把”2023-05-20”转换为”20/05/2023”(日/月/年格式)

三、捕获组的高级用法

1. 命名捕获组
1
(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})

1
(?'year'\d{4})-(?'month'\d{2})-(?'day'\d{2})

命名捕获组可以通过名称引用,使正则表达式更易读和维护

2. 非捕获组

当只需要分组而不需要捕获时,可以使用非捕获组(?:...)

1
(?:https?|ftp)://([^/\r\n]+)(/[^\r\n]*)?

这个表达式匹配URL,但只捕获域名和路径部分,不捕获协议部分

四、捕获组的注意事项

1. 捕获组编号
  • 捕获组从左到右编号,从1开始
  • 每个左括号(对应一个捕获组,包括嵌套的括号
  • 命名捕获组不影响编号顺序
2. 零宽断言中的捕获组
1
(?=(\d{3})$)

正向预查中的捕获组可以匹配但不消耗字符,但有些语言可能不支持

3. 不同编程语言的差异
语言/工具 引用方式 命名组语法 非捕获组语法
JavaScript $1, \1 (?<name>) (?:)
Python \1, \g<1> (?P<name>) (?:)
Java $1, \1 (?<name>) (?:)
.NET $1, \1 (?<name>) (?:)
PHP $1, \1 (?P<name>) (?:)

五、实际应用示例

  • 日期转换

    1
    2
    3
    4
    // JavaScript示例
    const dateStr = "2023-05-20";
    const newStr = dateStr.replace(/(\d{4})-(\d{2})-(\d{2})/, "$3/$2/$1");
    // 结果: "20/05/2023"
  • 验证重复单词

    1
    2
    3
    4
    5
    6
    # Python示例
    import re
    pattern = r'\b(\w+)\b\s+\1\b'
    text = "This is is a test test sentence"
    matches = re.findall(pattern, text)
    # 结果: ['is', 'test']

re模块

切分

1
2
3
4
5
6
re.split(正则表达式,字符串)

# 举例,以多个空格或者逗号分割
>>> re.split(r'[\s\,]+', 'a,b, c d')
['a', 'b', 'c', 'd']

分组

1
2
3
4
5
6
7
8
re.match(表达式,字符串)
分组用括号,括号内多个条件或时用|连接
# 举例 时间分割
>>> t = '19:05:30'
>>> m = re.match(r'^(0[0-9]|1[0-9]|2[0-3]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$', t)
>>> m.groups()
('19', '05', '30')

贪婪匹配

  • 正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符
  • 在匹配符后面加上?号,为非贪婪匹配
Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2023-2025 John Doe
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信