什么是正则表达式

正则表达式是用来匹配和处理文本的字符串。其核心能力Search and Replace:

  • 搜索: 实际上就是匹配字符串
  • 替换: 匹配到字符串后,可以进行字符串替换,更实用。

学习正则表达式的网站:https://regexr-cn.com/

匹配任意字符

.匹配任意单个字符、字母数字、以及.本身,除了换行符。 \.匹配.本身,而不是匹配任意字符。\是一个元字符,表示特殊含义,用来对字符进行转义。

匹配一组字符

[abc]匹配abc中的任意一个字符。在正则表达式里,可以用[ ]来定义一个字符集合,在字符集合里,出现在[ ]之间的所有字符都是该集合的组成部分,必须匹配其中的某个成员。

匹配字符集

[^abc]匹配除了abc之外的任意一个字符。 ^排除字符集合,强制匹配指定字符之外的字符。

匹配字符范围

[a-z]匹配az之间的任意一个字符。[0-9]匹配09之间的任意一个字符。 在使用正则表达式时,会频繁用到一些字符区间(例如:09,AZ等),为了简化字符区间的定义,正则表达式提供了一个特殊的元字符:-,可以用来定义字符区间。

数字元字符:

  • \d匹配任意数字字符,等价于[0-9]
  • \D匹配任意非数字字符,等价于[^0-9]

字母数字元字符:

  • \w匹配任意字母数字字符或下划线字符,等价于[a-zA-Z0-9_]
  • \W匹配任意非字母数字字符或下划线字符,等价于[^a-zA-Z0-9_]

匹配空白字符:

  • \s匹配任意空白字符,包括空格、制表符、换页符等,等价于[ \f\n\r\t\v]
  • \S匹配任意非空白字符,等价于[^ \f\n\r\t\v]

重复匹配

  • *匹配0个或多个字符。
  • +匹配1个或多个字符。例如,a+匹配一个或多个字符。
  • ?匹配0个或1个字符。
  • {n}匹配n次。比如[A-Z]{3},重复匹配3个大写字母。
  • {n,m}匹配n到m次。
  • {n,}匹配至少n次。

位置匹配

  • \b: 匹配单词边界。例如,\bfoo\b匹配单词foo,不匹配foobar
  • ^: 匹配行首。例如:^foo匹配以foo开头的行。
  • $: 匹配行尾。例如:foo$匹配以foo结尾的行。

实现原理

正则表达式底层的理论基础是有限状态自动机。计算机科学中,一个正则表达式可以等价地转换为一个有限状态自动机。 FSM是一个抽象的数学模型,它由一系列状态和连接这些状态的转移(条件)构成。

编译过程:当你编写一个正则表达式时,正则引擎(如PCRE、RE2)会首先将其“编译”成一个内部的数据结构(通常是NFA或DFA)。这个过程就像将高级语言编译成机器码。实际的正则引擎主要基于两种自动机实现:

  • 确定性有限自动机DFA(Deterministic Finite Automaton):并行、无状态。在任何输入位置,有且只有一条确定的状态转移路径。
  • 非确定性有限自动机NFA(Non-deterministic Finite Automaton):回溯、有状态。通过尝试所有可能的路径(回溯)来寻找匹配。。