深色模式
正则表达式
正则表达式的历史
1950年代,数学家斯蒂芬·科尔·克莱尼利用称之为“正则集合”的数学符号来描述此模型。肯·汤普逊将此符号系统引入编辑器QED
,随后是Unix
上的编辑器ed
,并最终引入grep
。自此以后,正则表达式被广泛地应用于各种Unix
或类Unix
系统的工具中。
正则表达式的POSIX规范,分为基本型正则表达式(Basic Regular Expression,BRE)和扩展型正则表达式(Extended Regular Expression,ERE)两大流派。
基础正则与扩展正则
基础正则与扩展正则,能够实现的功能基本相同。扩展正则虽然是基础正则的扩展,但是它并不兼容基础正则,它们的语法有差异,主要体现在:扩展正则的语法更丰富,并且元字符不必转义。
基础正则主要使用在一些经典的工具中,比如sed
、grep
等,扩展正则主要使用在增强型工具和现代编程语言中。
在Web开发领域,仅关注扩展正则即可。
扩展正则使用
下面仅对扩展正则的使用,做一些总结记录:
基础语法
字符匹配
plaintext
. 匹配任意单个字符(除换行符外)
\d 匹配任意数字 [0-9]
\w 匹配字母、数字、下划线 [A-Za-z0-9_]
\s 匹配空白字符(空格、制表符、换行符)
数量限定符
plaintext
* 匹配0次或多次 {0,}
+ 匹配1次或多次 {1,}
? 匹配0次或1次 {0,1}
{n} 匹配恰好n次
{n,} 匹配至少n次
{n,m} 匹配n到m次
位置匹配
plaintext
^ 匹配行首
$ 匹配行尾
\b 匹配单词边界
\B 匹配非单词边界
中级概念
字符类
plaintext
[abc] 匹配a、b或c中的任意一个字符
[^abc] 匹配除了a、b、c以外的任意字符
[a-z] 匹配a到z的任意小写字母
[A-Z] 匹配A到Z的任意大写字母
分组和引用
plaintext
(pattern) 捕获组
(?:pattern) 非捕获组
\1, \2 等 反向引用之前的捕获组
或运算
plaintext
| 表示或关系,如 cat|dog 匹配cat或dog
高级特性
环视(断言)
plaintext
(?=pattern) 正向先行断言
(?!pattern) 负向先行断言
(?<=pattern) 正向后行断言
(?<!pattern) 负向后行断言
贪婪与非贪婪
plaintext
*? 非贪婪的*
+? 非贪婪的+
?? 非贪婪的?
{n,m}? 非贪婪的{n,m}