正则表达式
📕

正则表达式

创建时间
Sep 22, 2024 07:21 AM
标签

介绍

正则表达式是一种用于匹配和处理文本模式的表达式。它是由字符和特殊字符组成的序列,用来描述一种字符串的匹配模式。在编程和文本处理中,正则表达式被广泛应用于搜索、替换、验证和提取文本数据。
正则表达式的功能:
  1. 模式匹配: 正则表达式可以根据定义的模式在文本中进行搜索和匹配。例如,搜索所有符合特定模式的字符串,如邮箱地址、电话号码等。
  1. 文本替换: 可以使用正则表达式进行文本替换。通过匹配特定模式的字符串并替换成指定的内容,可以对文本进行批量替换操作。
  1. 数据验证: 用于验证输入数据是否符合特定格式。比如验证用户名、密码、邮箱格式是否合法等。
  1. 文本提取: 可以从文本中提取出符合特定模式的内容。例如,从一段文字中提取URL链接、日期、数字等特定格式的信息。
  1. 字符串操作: 可以进行字符串的拆分、合并和其他复杂的操作,以符合特定的模式和要求。

正则表达式入门

正则表达式由两种字符构成, 元字符和文字, 一个完整的正则表达式由小的构建模块单元组成

元字符

正则表达式中的元字符是具有特殊含义的字符,它们用于定义匹配模式的基本元素。这些元字符在正则表达式中扮演着特殊角色,代表特定的字符、位置或者数量。

  • ^ : 锚定每一行的开头位置^cat: 表示以cat开头的行
  • $ : 锚定每一行的结尾位置cat$: 表示以cat结尾的行
  • \<: 锚定单词的开头
  • \>: 锚定单词的结尾
    • eg: ^$表示什么? 答案: 空行
“锚定”: 锚定和匹配有一定的区别,锚定匹配的是一个位置,匹配是指寻找一个具体的文本。
例如使用^锚定开头位置表示你的模式是要从行的开始开始匹配
“单词”:有字母或者数字组成的字符串
 

  • ?: 可选通配符, 表示前面的字符或者字符组出现0次或者一次, 例如colou?r可以表示colour, color
  • +:表示前面的字符或者字符组至少出现一次
  • *:表示前面的字符或者字符组出现任意次数
“量词”:限定了所作用元素的匹配次数

  • .: 通配符,用来匹配任意字符
  • | :“或”,表示分支,例如Bob | Robert 可以匹配 Bob或者Robert, 它的作用范围可以被()限定, 例如gr(a|e)y可以匹配gray或者grey, 如果不加括号gra|ey会匹配gra或者ey,这显然不符合预期,这一点值得注意

  • \s: 匹配所有空白, 包括制表符
  • \t: 匹配制表符
  • \n: 换行符
  • \w: [a-zA-Z0-9]
  • \W: 除了\w之外的所有字符
  • \d: [0-9]
  • \D: 除了\d之外的所有字符

字符组

[1-9a-zA-Z]
字符组是一对方括号括起来的字符组合, 例如[12345],匹配的时候可以匹配字符组里面的任意一个字符, 相当于一个想要的值的集合,只能选择括号里面的一个进行匹配, 简单来说就是的关系
例如:
  • [Rr]egular: 可以匹配Regular或者regular
  • 123[45]67: 可以匹配123467或者123567
值得注意的是, 有些字符在字符组内的语义会发生变化
  1. -
  • -在字符组外部表示普通字符,即匹配一个-
  • -在字符组里可以表示一个范围, 如[1-9], [a-z]分别表示数字1到9的数字的集合和a到z的字符的集合,即[123456789] 等价于[1-9]
  • 如果-出现在[]内部的开头部分, 那它只是表示一个-字符,失去了范围的语义
  1. 元字符
  • 元字符在字符组里面退化为普通字符,例如[0-9A-Z!.?*]里面只有两个-有特殊语义
  1. ^
  • ^如果出现在[]的开头部分, 表示该字符组是一个排除型字符组
    • 排除型字符组: 表示除了列举出来的字符之外的全部字符, 相当于取非操作 如:[^Rr]egular: 表示只要不是R和r开头的后续跟上egular的字符串, 例如aegular,begular,3egualr等等
  1. 一些常见的字符组包括:
      • [abc] 匹配字符集合中的任意一个字符,这里匹配字符 abc 中的任意一个。
      • [a-z] 表示字符范围,匹配从 az 中的任意一个小写字母。
      • [A-Z] 同样是字符范围,匹配从 AZ 中的任意一个大写字母。
      • [0-9] 表示匹配任意一个数字。
      • [a-zA-Z] 匹配任意一个大小写字母。
      • [^abc] 在字符组开头使用 ^,表示匹配除了字符集合内的字符以外的任意一个字符。

括号

  • 组成模块单元
    • (R|r)egular: 表示匹配Regular或者regular
      eg:比较^Regular|regular^(Regular|regular)的区别 第一个只限定了Regular需要在行的开头, 但是没有限制regular必须在行开头, 第二个则限制了两个都必须出现在行的开头
  • ()的另一个作用是记住匹配的文本, 方便后面直接引用, 引用方法在不同的框架里面有所不同
    • eg: (Regular) is important in \1 Expression: 可以匹配Regular is important in Regular Expression

转义字符

  • \表示转义字符, 可以把元字符转为普通字符串进行匹配, 有时候我们只想要匹配普通的., ?,等,这时候就需要在前面加上\, 否则会当作元字符处理
  • \加数字可以用于引用前面的匹配

环视

  1. 前瞻
前瞻用于检查在当前位置后面的字符是否满足某种条件。
  • 肯定前瞻:(?=...)
    • 检查在当前位置之后是否存在匹配...的字符串,但不包括在匹配结果中。
      示例:
      \w+(?=\d)
      匹配一个或多个单词字符,前提是后面跟着一个数字,但数字不会包含在匹配结果中。
      示例解释:
    • 在字符串 abc123 中,匹配的是 abc,因为它后面有数字 123
  • 否定前瞻:(?!...)
    • 检查在当前位置之后是否不存在匹配...的字符串。
      示例:
      \w+(?!\d)
      匹配一个或多个单词字符,前提是后面没有数字。
      示例解释:
    • 在字符串 abc123 中,匹配的是 abc,因为 abc 后面紧跟着数字 123,不满足条件,因此不匹配。
  1. 后顾
后顾用于检查当前位置之前的字符是否满足某种条件。
  • 肯定后顾:(?<=...)
    • 检查在当前位置之前是否存在匹配...的字符串。
      示例:
      (?<=\d)\w+
      匹配一个或多个单词字符,前提是前面有一个数字。
      示例解释:
    • 在字符串 123abc 中,匹配的是 abc,因为它前面有数字 123
  • 否定后顾:(?<!...)
    • 检查在当前位置之前是否不存在匹配...的字符串。
      示例:
      (?<!\d)\w+
      匹配一个或多个单词字符,前提是前面没有数字。
      示例解释:
    • 在字符串 abc123 中,匹配的是 abc,因为 abc 前面没有数字。

对正则表达式的匹配原理

正则表达式引擎可以根据实现方式和功能特点进行不同的分类:
  1. 基于DFA(Deterministic Finite Automaton)的引擎: 使用确定性有限状态自动机实现的引擎。这种引擎对于简单的正则表达式可以提供快速的匹配速度,但对于复杂的模式可能性能较差。
  1. 基于NFA(Nondeterministic Finite Automaton)的引擎: 使用非确定性有限状态自动机实现的引擎。NFA引擎通常具有更强大的功能和更灵活的语法支持,但在某些情况下可能会牺牲一些性能。
  1. Backtracking引擎: 这种引擎使用回溯算法来进行匹配。它能够处理更复杂的正则表达式,但在某些情况下可能会导致性能问题,特别是对于包含大量回溯的表达式。
  1. 基于编译的引擎: 在匹配前将正则表达式转换为内部的优化表示形式。这种引擎能够通过预先编译和优化来提高匹配效率。
  1. 多模式匹配引擎: 允许同时匹配多个模式,提高了处理多种模式的效率。
  1. Unicode兼容引擎: 针对Unicode字符集提供了更好的支持,能够处理更多语言和字符编码。
这些分类是根据引擎的实现方式、匹配策略和功能特点而来的。不同的引擎可能有不同的优缺点,适合不同类型的正则表达式和应用场景。选择合适的引擎通常取决于需求、性能要求和匹配的复杂度。

常用场景

  • 使用正则表达式修改文本
// 使用Str2替换Str1 s/Str1/Str2
  • 从路径中获取文件名
  • 去掉文件名开头的路径
  • 分别获取文件名和路径
  • 匹配对称的括号

速查表

字符
描述
^
锚定每一行的开头位置^cat: 表示以cat开头的行
$
锚定每一行的结尾位置cat$: 表示以cat结尾的行
[]
字符组
[^]
排除型字符组
.
匹配任意字符
()
划分单元
\<
锚定单词开头
\>
锚定单词结尾
?
加在字符后面,表示可选项
+
表示之前紧邻的那个元素出现一次或者多次
*
表示之前紧邻的元素出现任意多次, 包括不出现
{min,max}
量词区间, 限定重复次数