正则表达式

正则表达式详细说明

一、正则表达式基础概念

正则表达式(Regular Expression,简称 Regex 或 RegExp)是一种用于匹配和处理文本的强大工具,它通过特定的字符组合来描述文本模式。在编程、文本编辑器、命令行工具等场景中广泛应用,可用于文本搜索、替换、验证等操作。

二、正则表达式基本语法

1. 普通字符
  • 定义:直接匹配字符本身,包括字母、数字、标点符号等。

  • 示例

    • abc:匹配字符串中的abc子串。
    • 123:匹配数字123
2. 特殊字符(元字符)

元字符具有特殊含义,需配合转义符\使用才能匹配字面量。

元字符 含义 示例
. 匹配任意单个字符(除换行符\n外) a.c可匹配abca0c,但不匹配a\nc
^ 匹配字符串开头 ^abc仅匹配以abc开头的字符串
` 元字符 含义
------- ------------------------------------ --------------------------------------------
. 匹配任意单个字符(除换行符\n外) a.c可匹配abca0c,但不匹配a\nc
^ 匹配字符串开头 ^abc仅匹配以abc开头的字符串
 \| 匹配字符串结尾                       \| `abc$`仅匹配以`abc`结尾的字符串              |

| * | 匹配前一个元素 0 次或多次 | a*b可匹配b(a 出现 0 次)、abaab等 |
| + | 匹配前一个元素 1 次或多次 | a+b可匹配abaab,但不匹配b |
| ? | 匹配前一个元素 0 次或 1 次 | a?b可匹配bab |
| {n} | 匹配前一个元素恰好 n 次 | a{2}b匹配aab |
| {n,} | 匹配前一个元素至少 n 次 | a{2,}b匹配aabaaab等 |
| {n,m} | 匹配前一个元素 n 到 m 次 | a{1,3}b匹配abaabaaab |
| [] | 字符集合,匹配其中任意一个字符 | [abc]匹配abc |
| [^] | 否定字符集合,匹配不在其中的任意字符 | [^abc]匹配除abc外的字符 |
| \ | 转义符,使元字符变为普通字符 | \.匹配.\*匹配* |

3. 预定义字符类

为常见字符集合提供简写形式:

字符类 等价形式 含义
\d [0-9] 匹配数字
\D [^0-9] 匹配非数字
\w [a-zA-Z0-9_] 匹配字母、数字或下划线
\W [^a-zA-Z0-9_] 匹配非字母、数字或下划线
\s [ \t\n\r\f\v] 匹配空白字符(空格、制表符、换行符等)
\S [^ \t\n\r\f\v] 匹配非空白字符
4. 分组与反向引用
  • 分组

    :使用

    ()
    

    将多个元素组合为一个整体,可对分组应用量词。

    • 示例:(ab)+匹配abababababab等。
  • 反向引用

    :通过

    \n
    

    (n 为数字)引用分组内容,用于匹配重复模式。

    • 示例:(\d)\1匹配两个连续相同数字(如1122)。

三、正则表达式高级用法

1. 贪婪匹配与非贪婪匹配
  • 贪婪匹配

    :默认模式,尽可能多地匹配内容(使用

    *
    

    +
    

    ?
    

    {n,}
    

    )。

    • 示例:a.*b匹配a123b456b时,会匹配整个a123b456b
  • 非贪婪匹配

    :在量词后加

    ?
    

    ,尽可能少地匹配内容。

    • 示例:a.*?b匹配a123b456b时,仅匹配a123b
2. 零宽断言(环视)

用于指定匹配的位置,不消耗字符:

断言类型 语法 含义
正向先行断言 (?=pattern) 匹配右侧是pattern的位置
负向先行断言 (?!pattern) 匹配右侧不是pattern的位置
正向后发断言 (?<=pattern) 匹配左侧是pattern的位置
负向后发断言 (?<!pattern) 匹配左侧不是pattern的位置
  • 示例\d+(?=元)匹配价格(如100元中的100)。
3. 分支结构

使用|表示 “或” 关系,按顺序匹配分支。

  • 示例:(https?|ftp)://匹配http://https://ftp://

四、正则表达式应用场景

1. 文本验证
  • 邮箱验证

    ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
    
    • 解释:匹配用户名(字母、数字、特殊符号)+@+ 域名 + 后缀。
  • 手机号验证(中国大陆)

    ^1[3-9]\d{9}$
    
    • 解释:以 1 开头,第二位为 3-9,后跟 9 位数字。
2. 文本提取
  • 提取 URL

    https?://[^\s/$.?#].[^\s]*
    
    • 解释:匹配 http/https 开头的网址,排除空格和特殊符号。
3. 文本替换
  • 将驼峰命名转为下划线命名

    ([A-Z])
    

    替换为

    _$1
    

    ,并转为小写。

    • 示例:驼峰命名HumpName驼峰命名_hump_name

五、正则表达式工具与注意事项

1. 常用工具
  • 在线测试RegExrRegex101
  • 编程库
    • Python:re模块
    • JavaScript:RegExp对象
    • Java:java.util.regex
2. 注意事项
  • 转义字符:在编程语言中使用正则时,需注意双重转义(如 Python 中\\d表示\d)。
  • 性能优化:避免过度复杂的正则(如嵌套过多分组),可能导致匹配效率低下。
  • 跨平台差异:不同语言 / 工具对正则的支持可能有细微差异(如换行符处理)。

六、正则表达式示例解析

示例 1:匹配 HTML 标签
  • 正则:<(\w+)>.*?</\1>
  • 解析:
    • <(\w+)>:匹配开始标签(如<div>),分组 1 捕获标签名。
    • .*?:非贪婪匹配标签内容。
    • </\1>:匹配结束标签,\1引用分组 1 的标签名(如</div>)。
  • 限制:无法处理嵌套标签(如<div><span>text</span></div>),需使用更复杂的正则或 HTML 解析库。
示例 2:匹配日期(YYYY-MM-DD)
  • 正则:^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$
  • 解析:
    • \d{4}:匹配 4 位年份。
    • -(0[1-9]|1[0-2]):匹配月份(1-12)。
    • -(0[1-9]|[12]\d|3[01]):匹配日期(1-31)。

七、正则表达式学习资源

通过组合上述语法和技巧,可构建复杂的文本处理规则。实际应用中建议先拆分需求,逐步构建正则表达式,并通过工具测试验证效果。

posted @ 2025-07-10 09:54  crockery  阅读(541)  评论(0)    收藏  举报