正则表达式

本文最后更新于 2024年7月26日 晚上

什么是正则表达式

正则表达式是一组由字母和符号组成的特殊文本,是一种用于匹配和操作文本的强大工具,它可以在文本中查找、替换、提取你想要的文字,也可以用来验证特定的字符组成模式。一个正则表达式一般从左到右匹配主体字符串,常使用缩写的术语“regex”或“regexp”。

工具和基本语法

正则表达式一般以\<regex>\<flag>的形式存在,不同软件可能存在差异。<regex>就是我们需要输入的匹配规则,而<flag>则用于标记匹配模式。

<flag>总共有:

  • g: 全局匹配
  • i: 忽略大小写
  • m: 多行匹配
  • s: 单行匹配
  • y: 贪婪模式,匹配尽可能多的字符

⚠️⚠️⚠️<flag>标记在不同版本的正则表达式中的差距可能很大,具体请参考正则表达式版本

测试工具

正则表达式测试工具:

RegExr: Learn, Build, & Test RegEx

基本规则

我们利用<regex>来进行文本匹配

  • at: 匹配文本中的at字符
  • at.: 匹配文本中at加除换行符外的任意一个字符,.表示匹配除换行符外的任意一个字符
  • []: 表示字符集合,[et]表示匹配e或t,at[et],表示匹配at后跟一个e或一个t的字符,相当于匹配ate或att。
    • 方框内的字符还可以用短横线连接表示一个字符范围,如[a-zA-Z]表示匹配所有大小写字母
    • 方框内还可以使用^号来表示取反,如[^a-z]表示匹配除了小写字母外的所有字符

❗❗❗ 方框内的^号才表示取反,方框外的不表示取反

预定字符类

  • \d: 表示数字,和[0-9]的作用一致。
  • \D: 表示非数字
  • \w: 表示字母,数字或下划线
  • \W: 表示非字母,数字或下划线
  • \s: 表示空白字符,如空格,Tab
  • \S: 表示非空白字符,非空格,Tab

位置和边界匹配

  • ^: 匹配每一行的开头,如^a表示匹配以a开头的每一行

  • $: 匹配每一行的结尾,如^b表示匹配以b结尾的每一行

  • \b: 表示单词的边界,如\bin表示匹配以in开头的字符,而in\b则表示匹配以in结尾的字符

  • \B: 表示非单词边界的匹配

量词

+: 表示字符重复一次或多次,如at+表示at中t重复一次或多次,会匹配at, att, attt等
*: 表示字符重复0次或多次
?: 表示字符重复0次或一次
{}: 指定的重复次数,如{3}表示重复3次,{3,5}表示重复3到5次,{3,}表示至少重复3次,如果只想匹配重复3次的字符串,可以用{3,}?来表示非贪婪模式

分组和引用

  • 使用()来就创建分组,如(at){3,}?表示匹配at整体重复3次的字符串
  • 使用()创建的分组可以用$+数字来进行捕获,比如$1表示捕获第一个分组的内容
  • 在匹配字符前加?:表示非捕获分组,这一部分不能被捕获,如(?:\d{1,2})表示匹配一到两个数字但不捕获它

如果我们想匹配单词的开头和结尾都是相同字母的字符串,可以用\b([a-z])[a-z]*\1\b来进行匹配,其中\1表示引用前面的第一个分组内容([a-z])

前瞻后顾

示例内容:

1
2
3
4
$100
$200
$abd
$deg
  • 正向前瞻:仅匹配数字前的$,\$(?=\d+)
  • 负向前瞻:仅匹配非数字前的$,\$(?!\d+)
  • 正向后顾:仅匹配$后面的数字,(?<=\$)\d+
  • 负向后顾:仅匹配非$后面的数字,(?<!\$)\d+

正则表达式版本

  • POSIX基本 BRE
  • POSIX拓展 ERE
  • Perl兼容正则表达式 PCRE
  • Python, Javascript等

不同版本的正则表达式兼容情况不一样,并非所有特性都支持,如果出现匹配不到的情况,也许并非写的正则表达式不正确,而是版本不支持,详细支持情况请参考官方文档

参考


正则表达式
https://blog.stariverfeel.eu.org/posts/2f57a694.html
作者
Feel Liao
发布于
2024年7月26日
更新于
2024年7月26日
许可协议