it编程 > 编程语言 > 正则表达式

正则表达式基本语法及进阶用法超详细版

73人参与 2026-08-15 正则表达式

一、基本概念

正则表达式(regular expression)是一种强大的文本处理工具,用于匹配、查找、替换字符串中的特定模式。它通过一系列预定义的语法规则,描述字符串的结构特征,广泛应用于数据验证、文本解析、日志分析、搜索引擎等领域。

二、基础语法(核心元字符与规则)

正则表达式的语法由「普通字符」和「元字符」组成,元字符是具有特殊含义的符号,掌握它们是使用正则的基础。

1. 普通字符

2. 核心元字符(按功能分类)

元字符功能说明示例
.匹配任意单个字符(默认不匹配换行符 \n,部分语言可通过修饰符改变)。a.b 匹配 "axb""a1b""a#b"(不匹配 "a\nb")。
^匹配字符串开头(多行模式下匹配每行开头)。^hello 匹配 "hello world"(开头是 hello),不匹配 "xhello"
$匹配字符串结尾(多行模式下匹配每行结尾)。world$ 匹配 "hello world"(结尾是 world),不匹配 "worldx"
*匹配前面的元素 0 次或多次(贪婪匹配:尽可能多匹配)。ab* 匹配 "a""ab""abb""abbb"
+匹配前面的元素 1 次或多次(贪婪匹配)。ab+ 匹配 "ab""abb"(不匹配 "a")。
?匹配前面的元素 0 次或 1 次(可选匹配)。ab? 匹配 "a""ab"(不匹配 "abb")。
{n}匹配前面的元素 恰好 n 次(n 为非负整数)。a{3} 匹配 "aaa"(不匹配 "aa""aaaa")。
{n,}匹配前面的元素 至少 n 次(贪婪匹配)。a{2,} 匹配 "aa""aaa""aaaa"
{n,m}匹配前面的元素 n 到 m 次(n ≤ m,贪婪匹配)。a{2,3} 匹配 "aa""aaa"(不匹配 "a""aaaa")。
|逻辑「或」,匹配左边或右边的模式(优先级最低,需用括号提升优先级)。ab|cd 匹配 "ab" 或 "cd"a(b|c)d 匹配 "abd""acd"
()分组:将多个字符视为一个整体,同时捕获匹配结果(可通过反向引用使用)。(ab)+ 匹配 "ab""abab"(\w+)\s+(\w+) 捕获两个单词(如 "hello world")。
\转义字符:取消元字符的特殊含义,或表示预定义字符类(如 \d\s)。a\.b 匹配 "a.b". 作为普通字符);\* 匹配 "*"
[]字符类:匹配括号内任意一个字符(支持范围表示,^ 表示否定)。[abc] 匹配 "a""b""c"[^abc] 匹配非 a/b/c 的字符。
[-]字符类内的范围符:表示连续字符集(如字母、数字范围)。[a-z] 匹配小写字母;[0-9] 匹配数字;[a-za-z0-9] 匹配字母数字。

3. 预定义字符类(简化写法)

为了简化常见的字符匹配,正则提供了预定义的字符类(部分需结合修饰符使用):

预定义类等价于功能说明
\d[0-9]匹配任意数字(digit)。
\d[^0-9]匹配任意非数字。
\w[a-za-z0-9_]匹配字母、数字、下划线(word 字符,注意不包含空格和特殊字符)。
\w[^a-za-z0-9_]匹配非字母、数字、下划线。
\s[ \t\n\r\f\v]匹配任意空白字符(space:空格、制表符 \t、换行符 \n 等)。
\s[^ \t\n\r\f\v]匹配任意非空白字符。
\b-匹配单词边界(单词与非单词的分隔处,如 "hello world" 中的空格两侧)。
\b-匹配非单词边界(如 "helloworld" 中两个单词的连接处)。
\n-匹配换行符(部分语言支持 \r\n 匹配 windows 换行)。
\t-匹配制表符。

示例:

三、核心特性(进阶用法)

掌握基础语法后,需理解正则的核心特性(贪婪 / 非贪婪、分组 / 捕获、断言等),才能应对复杂场景。

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

默认情况下,正则的量词(*+?{n,m})是「贪婪的」—— 尽可能匹配更多字符。在量词后加 ? 可变为「非贪婪」—— 尽可能匹配更少字符。

模式类型示例(匹配字符串 "aabbaabcc")
a.*b贪婪匹配 "aabbaab"(从第一个 a 到最后一个 b)。
a.*?b非贪婪匹配 "aab"(从第一个 a 到最近的 b)。
a.+c贪婪匹配 "aabbaabcc"(从第一个 a 到最后一个 c)。
a.+?c非贪婪匹配 "aabbaabc"(从第一个 a 到最近的 c)。

2. 分组与捕获

() 不仅能将模式分组(视为整体),还能「捕获」匹配到的内容,后续可通过「反向引用」或编程接口获取。

(1)普通捕获组

示例:

(2)非捕获组

若只需分组(不捕获结果),用 (?:pattern),可提升性能(避免不必要的内存占用)。

示例:

(3)命名捕获组

为捕获组命名,便于后续引用(避免按编号混淆),语法:(?<name>pattern)(部分语言支持,如 python、javascript、java)。

示例:

3. 零宽断言(lookaround)

零宽断言是「匹配位置」的模式,不消耗字符(仅判断当前位置前后是否满足条件),分为「先行断言」和「后行断言」。

(1)先行断言(lookahead)

判断当前位置后面是否满足条件,语法:

示例:

(2)后行断言(lookbehind)

判断当前位置前面是否满足条件,语法:

示例:

4. 模式修饰符(flags)

修饰符用于改变正则的匹配行为(如忽略大小写、多行匹配等),不同语言的表示方式不同(如 python 用 re.ignorecase,javascript 用 /pattern/gi)。

常见修饰符:

修饰符作用说明
i忽略大小写(case-insensitive):a 可匹配 ab 可匹配 b
g全局匹配(global):找到所有匹配项,而非第一个(部分语言默认全局)。
m多行模式(multi-line):^ 匹配每行开头,$ 匹配每行结尾(默认仅匹配整体开头 / 结尾)。
s单行模式(single-line):. 匹配所有字符(包括换行符 \n,默认不匹配)。
uunicode 模式:支持 unicode 字符(如 \p{l} 匹配任意语言的字母)。
x忽略空格和注释(extended):便于编写复杂正则(用 # 写注释)。

示例:

四、常见应用场景(实战示例)

正则的核心价值是解决文本处理问题,以下是高频场景的实战示例:

1. 数据验证

示例 1:验证邮箱地址

using system;
using system.text.regularexpressions;

public class emailvalidator
{
    public static bool isvalidemail(string email)
    {
        // 正则表达式:^[a-za-z0-9._%+-]+@[a-za-z0-9.-]+\.[a-za-z]{2,}$
        string pattern = @"^[a-za-z0-9._%+-]+@[a-za-z0-9.-]+\.[a-za-z]{2,}$";
        return regex.ismatch(email, pattern);
    }

    public static void main()
    {
        string[] emails = {
            "test@example.com",
            "user.name+tag@example.co.uk",
            "invalid-email",
            "another.invalid@.com"
        };

        foreach (var email in emails)
        {
            console.writeline($"{email}: {isvalidemail(email)}");
        }
    }
}

输出:

test@example.com: true
user.name+tag@example.co.uk: true
invalid-email: false
another.invalid@.com: false

示例 2:验证手机号(中国大陆)

public class phonevalidator
{
    public static bool isvalidphone(string phone)
    {
        // 正则表达式:^1[3-9]\d{9}$
        string pattern = @"^1[3-9]\d{9}$";
        return regex.ismatch(phone, pattern);
    }

    public static void main()
    {
        string[] phones = {
            "13812345678",
            "19987654321",
            "1234567890",
            "138123456789"
        };

        foreach (var phone in phones)
        {
            console.writeline($"{phone}: {isvalidphone(phone)}");
        }
    }
}

2. 文本提取

示例 3:从 html 中提取链接

using system;
using system.text.regularexpressions;

class linkextractor
{
    static void main()
    {
        string html = @"
            <a href=""https://www.example.com" rel="external nofollow" ">example</a>
            <a href=""https://www.google.com" rel="external nofollow" ">google</a>
            <img src=""image.jpg"">
        ";

        // 正则表达式:<a\s+href=""([^" rel="external nofollow"  rel="external nofollow" "]*)""
        string pattern = @"<a\s+href=""([^" rel="external nofollow"  rel="external nofollow" "]*)""";
        matchcollection matches = regex.matches(html, pattern);

        foreach (match match in matches)
        {
            console.writeline(match.groups[1].value);
        }
    }
}

输出:

https://www.example.com
https://www.google.com

示例 4:提取字符串中的所有数字

class numberextractor
{
    static void main()
    {
        string input = "订单号:20230518001,金额:99.9元,数量:10";
        string pattern = @"\d+\.?\d*"; // 匹配整数或小数

        matchcollection matches = regex.matches(input, pattern);
        foreach (match match in matches)
        {
            console.writeline(match.value);
        }
    }
}

输出:

20230518001
99.9
10

3. 文本替换与格式化

示例 5:替换字符串中的敏感信息

class textreplacer
{
    static void main()
    {
        string input = "手机号:15112347676,身份证号:410123194910011234";
        
        // 替换手机号中间4位为****
        string phonepattern = @"(1[3-9])\d{4}(\d{4})";
        string result = regex.replace(input, phonepattern, "$1****$2");

        // 替换身份证号中间8位为********
        string idpattern = @"(^\d{6}|\d{8})(\d{4}$)";
        result = regex.replace(result, idpattern, "$1********$2");

        console.writeline(result);
    }
}

输出:

手机号:151****7676,身份证号:410123********1234

示例 6:格式化日期(mm/dd/yyyy → yyyy-mm-dd)

class dateformatter
{
    static void main()
    {
        string input = "today is 11/21/2025";
        string pattern = @"\b(\d{2})/(\d{2})/(\d{4})\b";
        
        // 替换为 yyyy-mm-dd
        string result = regex.replace(input, pattern, "$3-$1-$2");
        console.writeline(result);
    }
}

输出:

today is 2025-11-21

4. 高级应用:正则表达式分组与命名捕获

示例 7:解析日志文件

假设日志格式为:[2025-11-21 14:30:00] [info] user 'admin' logged in.

class logparser
{
    static void main()
    {
        string log = "[2025-11-21 14:30:00] [info] user 'admin' logged in.";
        
        string pattern = @"\[(.*?)\] \[(.*?)\] (.*)";
        match match = regex.match(log, pattern);

        if (match.success)
        {
            string timestamp = match.groups[1].value;
            string level = match.groups[2].value;
            string message = match.groups[3].value;
            
            console.writeline($"时间:{timestamp}\n级别:{level}\n内容:{message}");
        }
    }
}

输出:

时间:2025-11-21 14:30:00
级别:info
内容:user 'admin' logged in.

示例 8:使用命名捕获组

class namedgroupexample
{
    static void main()
    {
        string input = "name: john, age: 30, email: john@example.com";
        
        string pattern = @"name: (?<name>\w+), age: (?<age>\d+), email: (?<email>[^,]+)";
        match match = regex.match(input, pattern);

        if (match.success)
        {
            console.writeline($"姓名:{match.groups["name"].value}");
            console.writeline($"年龄:{match.groups["age"].value}");
            console.writeline($"邮箱:{match.groups["email"].value}");
        }
    }
}

五、注意事项与性能优化

1. 注意事项

2. 性能优化

复杂正则可能导致回溯过多,影响性能,需注意:

六、常见正则表达式示例(直接复用)

1. 验证类

场景正则表达式(c# 字符串需转义,或用 @ 逐字字符串)
手机号(中国大陆)^1[3-9]\d{9}$
邮箱^[a-za-z0-9._%+-]+@[a-za-z0-9.-]+\.[a-za-z]{2,}$
身份证号(18 位)^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}([0-9]|x|x)$
url(http/https)^https?://[^\s]+$
日期(yyyy-mm-dd)^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$
密码(8-20 位,含大小写字母、数字、特殊字符)^(?=.*[a-z])(?=.*[a-z])(?=.*\d)(?=.*[^\da-za-z]).{8,20}$

2. 提取类

场景正则表达式
提取所有数字\d+
提取所有链接https?://[^\s]+
提取 html 标签内容(如 <title>xxx</title><title>(.*?)</title>
提取邮箱地址[a-za-z0-9._%+-]+@[a-za-z0-9.-]+\.[a-za-z]{2,}

3. 替换类

场景正则表达式
去除所有空格\s+
格式化手机号(13812345678 → 138-1234-5678)(\d{3})(\d{4})(\d{4})
替换 html 标签(去除所有标签)<[^>]+>
敏感词替换(“垃圾”“废物” 替换为 “***”)(垃圾|废物)

到此这篇关于正则表达式基本语法及进阶用法的文章就介绍到这了,更多相关正则表达式详解内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

正则表达式基本用法及知识点总结(学会就够用)

08-15

正则表达式匹配Unicode和其他字符的方法

08-10

正则表达式模式匹配的简单方式

08-10

正则表达式使用元字符(必知必会)

08-09

RabbitMQ延迟队列怎么实现?TTL+死信队列和插件方案详解

08-18

正则表达式位置匹配应用示例代码

08-20

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论