// 开发工具 · 2025-01-21

正则表达式基础与应用

什么是正则表达式?

正则表达式(Regular Expression,在代码中常简写为regex、regexp或RE)是一种用于描述字符串结构的语法规则。它定义了一个搜索模式,可以用来匹配、替换或提取文本中的子串。正则表达式广泛应用于文本处理、数据验证、查找和替换等场景。

正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。


正则表达式的语法规则

正则表达式由元字符(metacharacters)和文本字符(literal characters)两部分构成。元字符具有特殊的功能,而文本字符则是普通的字符。

元字符

  • ^:匹配行的开始位置。
  • $:匹配行的结束位置。
  • .:匹配除换行符之外的任何单个字符。
  • []:字符类,用于匹配某个范围内的字符。
  • |:选择符,表示“或”。
  • \:转义字符,用于转义元字符,或者表示一些预定义字符类。
  • () :分组和捕获。
  • {}:限定符,指定前面的字符重复出现的次数。

例子

/\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/   # 一个常见的邮箱匹配表达式

为了简化表达和更易阅读,后续我们省略掉定界符(/)部分,直接呈现正则表达式的核心内容。

常见元字符与用法

行定位符

  • ^:匹配字符串的开始。例如,^tm 会匹配行首的 tm。
  • $:匹配字符串的结束。例如,tm$ 会匹配行尾的 tm。

单词定界符

  • \b:匹配单词边界,表示匹配完整的单词。前后不能是字母、数字或下划线(即不能是一个长单词的一部分)。例如,cat 是单独的单词,而像 caterpillar 中的 cat 则不是单独的单词。
  • \B:与 \b 相反,表示不匹配单词边界。

字符类

  • [abc]:匹配方括号内的任意单个字符,如 a、b 或 c。
  • [^abc]:匹配不在方括号中的字符,即除了 a、b 和 c 外的任何字符。

注意:中括号内的字符按字面意义匹配,不需要额外转义。

预定义字符类

  • \d:匹配任意一个数字,等同于 [0-9]。
  • \D:匹配非数字字符,等同于 [^0-9]。
  • \w:匹配任意一个字母、数字或下划线,等同于 [a-zA-Z0-9_]。
  • \W:匹配非字母、非数字和非下划线字符。
  • \s:匹配任意一个空白字符(包括空格、制表符、换行符等)。
  • \S:匹配非空白字符。

限定符(量词)

  • ?:匹配前面的字符零次或一次。例如,colou?r 可以匹配 color 和 colour。
  • +:匹配前面的字符一次或多次。例如,go+gle 可以匹配 gogle、googgle 等。
  • *:匹配前面的字符零次或多次。例如,go*gle 可以匹配 gle、google、googgle 等。
  • {n}:匹配前面的字符恰好 n 次。例如,go{2}gle 只会匹配 google。
  • {n,}:匹配前面的字符至少 n 次。例如,go{2,}gle 可以匹配 google、googgle 等。
  • {n,m}:匹配前面的字符至少 n 次,最多 m 次。例如,employe{0,2} 可以匹配 employ、employe 和 employee。

选择字符(|)

  • |:表示“或”操作。例如,(T|t)(M|m) 可以匹配 TM、Tm、tM 或 tm。

连字符(-)

  • -:表示字符范围。例如,[a-zA-Z] 可以匹配任何大小写字母。

括号字符(())

  • ():用于分组。例如,(thir|four)th 可以匹配 thirth 或 fourth。
  • 分组的作用不仅仅是捕获子表达式,还能影响其他操作符(如 *、+ 等)的应用范围。
  • (?: ... ):非捕获组,用于分组,但不捕获匹配的内容,可以提高性能,并避免捕获组编号的混乱。

转义字符(\)

  • \:用来转义元字符,使其失去特殊意义。例如,\. 匹配字面上的点号 .。
  • 反斜线还可以用于表示一些特殊字符或定义字符集:\d 表示数字,\s 表示空白字符等。

断言(环视)

断言用于匹配某些位置,不会消耗字符,但可以检查字符的上下文。

  • 顺序环视(前瞻):(?=...),表示匹配前面必须跟着某个子串。例如,\s(?=is) 匹配空格,后面紧跟着 is。
  • 逆序环视(后顾):(?<=...),表示匹配前面有某个子串。例如,(?<=is)\s 匹配 is 后面的空格。

模式修饰符

模式修饰符用于修改正则表达式的行为,通常放在正则表达式的定界符末尾。

  • i:忽略大小写。例如,/abc/i 可以匹配 abc、ABC 等。
  • m:多行模式,影响 ^ 和 $ 的行为,使其匹配每一行的开始和结束。
  • s:单行模式,使 . 能够匹配换行符。如/abc.def/s可以匹配 abc 和 def 之间有换行符的情况。
  • x:忽略正则表达式中的空格,方便书写复杂的正则。

常用表达式演示

数字校验

数字:^ [0-9]*$
n位的数字:^\d{n}$
至少n位的数字:^\d{n,}$
m-n位的数字:^\d{m,n}$
零和非零开头的数字:^(0|[1-9][0-9]*)$
非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$
带1-2位小数的正数或负数:^(-)?\d+(.\d{1,2})?$
正数、负数、和小数:^(-|+)?\d+(.\d+)?$
有两位小数的正实数:^ [0-9]+(.[0-9]{2})?$
有1~3位小数的正实数:^ [0-9]+(.[0-9]{1,3})?$
非零的正整数:^ [1-9]\d*$ 或 ^([1-9][0-9]){1,3}$ 或 ^+?[1-9][0-9]$
非零的负整数:^-[1-9][]0-9"$ 或 ^-[1-9]\d$
非负整数:^\d+$ 或 ^ [1-9]\d*|0$
非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
非负浮点数:^\d+(.\d+)?$ 或 ^ [1-9]\d*.\d*|0.\d*[1-9]\d*|0?.0+|0$
非正浮点数:^((-\d+(.\d+)?)|(0+(.0+)?))$ 或 ^(-([1-9]\d*.\d*|0.\d*[1-9]\d*))|0?.0+|0$
正浮点数:^ [1-9]\d*.\d*|0.\d*[1-9]\d*$ 或 ^ (([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9]))$
负浮点数:^-([1-9]\d*.\d*|0.\d*[1-9]\d*)$ 或 ^(-(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9])))$
浮点数:^(-?\d+)(.\d+)?$ 或 ^-?([1-9]\d*.\d*|0.\d*[1-9]\d*|0?.0+|0)$

验证字符

汉字 :^ [\u4e00-\u9fa5]{0,}$
英文和数字:^ [A-Za-z0-9]+$ 或 ^ [A-Za-z0-9]{4,40}$
长度为3-20的所有字符:^.{3,20}$
由26个英文字母组成的字符串:^ [A-Za-z]+$
由26个大写英文字母组成的字符串:^ [A-Z]+$
由26个小写英文字母组成的字符串:^ [a-z]+$
由数字和26个英文字母组成的字符串:^ [A-Za-z0-9]+$
由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$
中文、英文、数字包括下划线:^ [\u4E00-\u9FA5A-Za-z0-9_]+$
中文、英文、数字但不包括下划线等符号:^ [\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^ [\u4E00-\u9FA5A-Za-z0-9]{2,20}$

其他常用验证

1.域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?

2.手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$

3.身份证号(15位、18位数字):^\d{15}|\d{18}$

4.密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^ [a-zA-Z]\w{5,17}$

5.日期格式:^\d{4}-\d{1,2}-\d{1,2}

6.一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$

7.一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$

8.xml文件:^([a-zA-Z]±?)+[a-zA-Z0-9]+\.[x|X][m|M][l|L]$

9.中文字符的正则表达式:[\u4e00-\u9fa5]

10.QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)

11.中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)

12.IP地址:\d+.\d+.\d+.\d+ (提取IP地址时有用)

13.IP地址:(( ? : ( ?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))

14.文件扩展名效验:^([a-zA-Z]\: |\\)\\([^\\]+\\)* [ ^ \/: * ?"<>|]+\.txt(l)?$

小结

正则表达式是强大的文本处理工具,通过掌握其基本语法规则,可以方便地对字符串进行匹配、查找和替换等操作。掌握元字符、限定符、断言等功能,能够帮助我们构建更精确和高效的正则表达式。

正则表达式的学习需要耐心,理解每个元字符的含义以及如何组合它们来构建复杂的匹配模式是掌握正则的关键。

原文 https://blog.csdn.net/2301_79518550/article/details/145281313