正则表达式(Regular Expression)详解

发布于:2025-05-09 ⋅ 阅读:(27) ⋅ 点赞:(0)

正则表达式(简称"regex"或"regexp")是一种强大的文本模式匹配工具,它使用特定语法来描述、匹配和操作字符串。

基本概念

正则表达式是由普通字符(如字母a到z)和特殊字符(称为"元字符")组成的文本模式。这个模式描述在搜索文本时要匹配的一个或多个字符串。

主要用途

  1. 验证:检查字符串是否符合特定模式(如邮箱、电话号码格式)
  2. 搜索:在文本中查找特定模式的字符串
  3. 替换:将匹配的文本替换为其他内容
  4. 提取:从字符串中提取特定部分

基本语法

常见元字符

元字符 说明
. 匹配任意单个字符(除换行符外)
^ 匹配字符串的开始位置
$ 匹配字符串的结束位置
* 匹配前面的子表达式零次或多次
+ 匹配前面的子表达式一次或多次
? 匹配前面的子表达式零次或一次
\d 匹配一个数字字符,等价于[0-9]
\w 匹配字母、数字或下划线,等价于[A-Za-z0-9_]
\s 匹配任何空白字符(空格、制表符、换行符等)
[abc] 匹配a、b或c中的任意一个字符
[^abc] 匹配任何不在a、b或c中的字符
{n} 匹配恰好n次
{n,} 匹配至少n次
{n,m} 匹配至少n次,最多m次

示例

  1. 匹配手机号(中国大陆):

    ^1[3-9]\d{9}$
    
    • ^:字符串开始
    • 1:数字1开头
    • [3-9]:第二位是3-9中的一个数字
    • \d{9}:后面跟着9个数字
    • $:字符串结束
  2. 匹配邮箱

    ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
    
  3. 匹配日期(YYYY-MM-DD格式):

    ^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$
    

在不同语言中的使用

JavaScript

// 创建正则表达式
const regex = /pattern/flags;  // 字面量形式
const regex = new RegExp("pattern", "flags");  // 构造函数形式

// 使用示例
const phoneRegex = /^1[3-9]\d{9}$/;
console.log(phoneRegex.test("13812345678")); // true

const match = "Hello 123".match(/\d+/);
console.log(match[0]); // "123"

Python

import re

# 匹配
phone_pattern = r'^1[3-9]\d{9}$'
if re.match(phone_pattern, "13812345678"):
    print("Valid phone number")

# 查找所有匹配
numbers = re.findall(r'\d+', 'abc123def456')
print(numbers)  # ['123', '456']

Java

import java.util.regex.*;

Pattern pattern = Pattern.compile("^1[3-9]\\d{9}$");
Matcher matcher = pattern.matcher("13812345678");
boolean isMatch = matcher.matches(); // true

进阶概念

  1. 分组:使用()捕获分组

    ^(\d{3})-(\d{3,8})$  // 匹配区号-电话号码
    
  2. 非贪婪匹配:在*+后加?实现最小匹配

    <.*?>  // 匹配HTML标签(非贪婪模式)
    
  3. 先行断言

    • (?=pattern) 正向先行断言
    • (?!pattern) 负向先行断言
  4. 修饰符

    • i 不区分大小写
    • g 全局匹配
    • m 多行模式

学习建议

  1. 从简单模式开始练习
  2. 使用在线工具(如regex101.com)测试你的正则表达式
  3. 记住常见模式(如邮箱、URL、电话号码等)
  4. 注意不同语言中正则表达式实现的细微差异

正则表达式虽然学习曲线较陡,但一旦掌握,可以极大地提高文本处理的效率和能力。


网站公告

今日签到

点亮在社区的每一天
去签到