正则表达式

一、什么是正则表达式?

正则表达式是一种用于描述、匹配、检索和替换符合某些规则的文本字符串的工具。它像是一种简洁的“模式语言”,可以快速定位和操作大量文本中的特定内容。

简而言之,正则表达式就是用特定的语法来描述一类字符串的规则,然后用这个规则去匹配、查找、筛选实际的文本内容。


二、正则表达式的基础语法

1. 元字符(Metacharacters)

正则表达式由普通字符(如 a、1、X)和特殊字符(元字符)组成。常用的元字符有:

符号 说明 示例
. 匹配除换行符以外的任意字符 a.b 能匹配 "acb"、"a_b" 等
^ 匹配行的开头 ^abc 匹配以 "abc" 开头的行
$ 匹配行的结尾 abc$ 匹配以 "abc" 结尾的行
* 匹配前面的子表达式零次或多次 ab*c 匹配 "ac"、"abc"、"abbbc" 等
+ 匹配前面的子表达式一次或多次 ab+c 匹配 "abc"、"abbbc" 等
? 匹配前面的子表达式零次或一次 ab?c 匹配 "ac"、"abc"
{n} 精确匹配n次 a{3} 匹配 "aaa"
{n,} 至少匹配n次 a{2,} 匹配 "aa"、"aaa"、"aaaa"等
{n,m} 匹配n到m次 a{1,3} 匹配 "a"、"aa"、"aaa"
[] 匹配括号内的任意一个字符 [abc] 匹配 "a"、"b" 或 "c"
` ` 或,匹配左右任意一个表达式
() 分组、提取、捕获 (abc)+ 匹配 "abc"、"abcabc"

2. 常用转义字符

符号 说明 示例
\d 匹配一个数字,等价于[0-9] \d\d 匹配 "23"
\D 匹配一个非数字字符 \D 匹配 "a"
\w 匹配字母或数字或下划线 \w+ 匹配 "abc_123"
\W 匹配非字母、数字、下划线 \W 匹配 "@"
\s 匹配任意的空白符(空格、制表符) \s 匹配 " "
\S 匹配非空白符 \S 匹配 "a"

3. 贪婪与懒惰

  • 默认是贪婪的:会尽可能多地匹配内容。

  • 加上 ? 就变成懒惰(最少匹配)。

例:
正则 a.*b 匹配 "acccbdefb",结果是从第一个 a 到最后一个 b。
正则 a.*?b 只会匹配第一个 a 到第一个 b。


三、常见应用场景

  1. 数据校验

    • 验证邮箱地址:^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$

    • 验证手机号:^1[3-9]\d{9}$

  2. 数据提取

    • 提取网页中的链接:href="([^"]+)"

    • 提取数字:\d+

  3. 数据清洗/替换

    • 去除多余空格:\s+ 替换成空

  4. 文本搜索和高亮

    • 查找所有包含 "error" 的行:^.*error.*$


四、实用案例解析

1. 匹配中国身份证号

\d{17}[\dXx]

含义:前17位数字,最后一位可以是数字、X 或 x。

2. 匹配日期格式(如 2025-07-24)

\d{4}-\d{2}-\d{2}

3. 匹配 IPv4 地址

(?:\d{1,3}\.){3}\d{1,3}

五、进阶用法

1. 分组和引用

  • 分组:用括号 () 把内容分成一个组。

  • 反向引用\1\2 表示前面第1、第2个分组。

例子:匹配重复单词
正则:(\b\w+\b)\s+\1
能匹配 "hello hello"、"word word"。

2. 断言(零宽断言)

  • 正向肯定断言(?=pattern)

  • 正向否定断言(?!pattern)

  • 反向肯定断言(?<=pattern)

  • 反向否定断言(?

例:匹配所有以 .com 结尾的邮箱用户名
(?<=^)[^@]+(?=@.*\.com$)


六、正则表达式的优缺点

优点:

  • 高效、灵活,可以处理复杂的文本操作。

  • 各种编程语言都支持,通用性强。

缺点:

  • 语法较难,初学时容易出错。

  • 可读性较差,复杂表达式维护困难。

  • 匹配效率在极端情况下可能较低。


你可能感兴趣的:(字符串,正则表达式,mysql,数据库)