什么是正则表达式
正则表达式是用来匹配和处理文本的字符串。其核心能力Search and Replace:
- 搜索: 实际上就是匹配字符串
- 替换: 匹配到字符串后,可以进行字符串替换,更实用。
学习正则表达式的网站:https://regexr-cn.com/
匹配任意字符
.匹配任意单个字符、字母数字、以及.本身,除了换行符。
\.匹配.本身,而不是匹配任意字符。\是一个元字符,表示特殊含义,用来对字符进行转义。
匹配一组字符
[abc]匹配a、b、c中的任意一个字符。在正则表达式里,可以用[ ]来定义一个字符集合,在字符集合里,出现在[ ]之间的所有字符都是该集合的组成部分,必须匹配其中的某个成员。
匹配字符集
[^abc]匹配除了a、b、c之外的任意一个字符。 ^排除字符集合,强制匹配指定字符之外的字符。
匹配字符范围
[a-z]匹配a到z之间的任意一个字符。[0-9]匹配0到9之间的任意一个字符。 在使用正则表达式时,会频繁用到一些字符区间(例如: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):回溯、有状态。通过尝试所有可能的路径(回溯)来寻找匹配。。