精通正则
🎆

精通正则

什么是正则

正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"),可以用来描述和匹配字符串的特定模式。
正则表达式是一种用于模式匹配和搜索文本的工具。
正则表达式提供了一种灵活且强大的方式来查找、替换、验证和提取文本数据。

正则语法

验证地址

特殊字符

  • /exp/gm g表示全局匹配, m 表示多行匹配
 
  • . 表示任意一个非换行符之外的任意一个字符
示例:
.at 表示任意一个前缀后跟at的字符,例如 bat, xat等
a.t 表示任意一个at中间夹上任意一个字符的三个字符串,例如act, aet等
at. 类似的意思
  • [] 方括号表示匹配方括号内的任意一个字符即可
示例
at[xy] 可以匹配 atx, aty
a[xy]t 可以配置 axt, ayt
[xy]at 可以配置xat,yat
以后类似的可以放在任意位置的示例就举例一个就行。
方括号内可以使用中划线表示范围,例如
[a-z]表示所有的小写字母
[A-Z]表示所有的大写字母
[0-9]表示有的数字 \d 同理 \D 表示取反
  • \w 表示字母或数字和下划线 \W 表示取反
  • at[a-zA-Z0-9] 表示at后面跟上一个小写字母或者大写字母或者数字
  • \s 表示匹配空白字符 空格,tab 回车 \S 取反
  • ^ 在方括号内
    • 最前面加一个^表示对方括号的表达式取反,例如 at[^a-z] 表示匹配非小写字母即可匹配, 如果
      在方括号外面则表示匹配一行的开头,例如 ^a 表示以a开头的行.
  • \ 表示转义,例如 . 表示一个任意字符 \. 就表示 . 本身
  • $ 表示结尾,例如表示以 . 结尾的地方 \.$ 即可, 例如匹配某一行只有at. 可以使用 ^at\.$
  • \b 表示单词的边界, 例如 \bin 表示匹配in开头的单词, in\b 表示匹配in结尾的部分 \bin\b 表示匹配in单词.
  • \B 则和上面取反, 表示非边界

量词

  • + 表示前面的字符出现了一次或多次, 例如 at+ 表示t出现了至少一次,at, att, attttttt
  • * 表示0次或者多次
  • ? 表示0次或者1次
  • {n} 表示出现n次 例如,at{3} 表示匹配 attt 即t出现3次的情况, at{3,} 表示匹配3次以上,由于贪婪模式,导致可以匹配后面无限多个t, 可以在花括号后面加一个? 表示非贪婪模式,at{3,}?, at{3,5} 表示匹配3到5次

分组

  • (at){3} 表示匹配at整体出现3次,括号表示整体
  • 匹配pattern单词,无论首字母大小写均可, [pP]attern 或者 (p|P)attern

捕获

  • 依赖分组,例如匹配多中日期格式
    • \d{4}[-/\.=]?\d{1,2}[-/\.=]?\d{1,2} 2024-05-01 2024/05/02 2024.05.03 20240504 2024=05=05 对上面的表达式分组,捕获年月日 (\d{4})[-/\.=]?(\d{1,2})[-/\.=]?(\d{1,2}) 替换为统一格式使用 月日年, $1,2,3 分别表示匹配上面的第1,2,3个小括号内捕获的内容。 $2-$3-$1 05-01-2024 05-02-2024 05-03-2024 05-04-2024 05-05-2024 如果分组后不想使用捕获功能,可以使用?: 标示, 例如不想捕获月份信息 (\d{4})[-/\.=]?(?:\d{1,2})[-/\.=]?(\d{1,2}) 那么$1,2 就会分别表示年份和日期, 不会有月份信息了。

引用

  • 匹配开头和结尾相同字母的单词
    • \b([a-z])[a-z]*\1\b 前后的两个\b 表示匹配的是一个单词 \1 表示引用第一个分组 可以匹配到 agdfdsa alibaba tencent

前瞻后顾

示例数据
$100 $139 $abff $jjdjkd %224 &1333
  • 匹配后面是数字的$符号 \$(?=\d+) \$ 表示$本身, ?= 表示正向前瞻,即 \d+ 匹配true的场景, 匹配到了前2个$符号
  • 匹配后面是非数字的$ 符号 \$(?!\d+) ?! 表示对括号内的内容取反, 负向前瞻。
  • 匹配$后面的数字 (?<=\$)\d+ ?≤ 表示正向顾后,即匹配100 和 139
  • 如果把=号替换成! 号表示取反 (?<!\$)\d+,即非$ 后面的数字, 这里匹配的是 00 和 39, 如果希望匹配的是数字整体而不是一部分,可以用 \b 来表示边界, (?<!\$)\b\d+\b 可以匹配224 和 1333

版本问题

有些特性可能在不同的语言中可能不支持,需要注意不一定是表达式本身的问题。

常用示例

总结