正则表达式

正则表达式是为了能够在不同情景下匹配到符合要求的字符串文本而产生的,比如你想一次性就能在一堆文档中找到标题含有"python"或者"cpp",但不同时含有"机器学习"的文档,就只能用正则表达式,才能避免一般方法造成的不准确结果

语法

正则字符 说明 例子
\ 将下一个字符转义为原义 / 特殊 / 引用 / 转义字符 \n 匹配换行,\( 匹配 (
^ 匹配字符串开始位置 ^abc 匹配 "abc123"
$ 匹配字符串结束位置 abc$ 匹配 "123abc"
* 前面的子表达式 0 次或多次 zo* 匹配 zzo
+ 前面的子表达式 1 次或多次 zo+ 匹配 zozoo
? 前面的子表达式 0 或 1 次 colou?r 匹配 color
{n} 精确匹配 n 次 o{2} 匹配 food
{n,} 至少匹配 n 次 o{2,} 匹配 fooo
{n,m} 匹配 n 到 m 次 o{1,3} 匹配 ooo
*? +? ?? 非贪婪匹配 o+?oooo 中只匹配一个
. 匹配除换行外的 任意字符 a.c 匹配 abc
(pattern) 捕获分组,保存结果 (ab)+ 捕获 ab
(?:pattern) 非捕获分组 (?:ab)+ 不保存
(?=pattern) 正向肯定预查 Windows(?=10)
(?!pattern) 正向否定预查 Windows(?!XP)
(?<=pattern) 反向肯定预查 (?<=\$)\d+
(?<!pattern) 反向否定预查 (?<!\$)\d+
x|y 匹配 x 或 y `cat
[xyz] 字符集合,匹配任意一个 匹配 […] 中的所有字符,例如 [aeiou] 匹配字符串 “google runoob taobao” 中所有的 e o u a 字母。
[^xyz] 负字符集合 匹配除了 […] 中字符的所有字符,例如 [^aeiou] 匹配字符串 “google runoob taobao” 中除了 e o u a 字母的所有字符。
[a-z] 字符范围 [A-Z] 表示一个区间,匹配所有大写字母,[a-z] 表示所有小写字母。
[^a-z] 反向字符范围 [^a-z]
\b 单词边界 er\b 匹配 never
\B 非单词边界 er\B 匹配 verb
\d 数字字符 \d+
\D 非数字字符 \D+
\s 空白字符 \s+
\S 非空白字符 \S+
\w 单词字符 \w+
\W 非单词字符 \W+
\n 换行符 \n
\t 制表符 \t
\r 回车符 \r
\unnnn Unicode 字符 \u4E2D → 中
\1 \2 向后引用分组 (.)\1 匹配 aa

修饰符

正则表达式修饰符(也称为模式修饰符或标记)是用于改变正则表达式匹配行为的特殊指令。
标记也称为修饰符,正则表达式的标记用于指定额外的匹配策略。
标记不写在正则表达式里,标记位于表达式之外,格式如下:
/pattern/flags

举两个例子:

  1. i (ignore case) - 忽略大小写
    使匹配不区分大小写

示例:/abc/i 可以匹配 “abc”, “Abc”, “ABC” 等

支持语言:几乎所有正则表达式实现(JavaScript、PHP、Python等)

  1. g (global) - 全局匹配
    查找所有匹配项,而不是在第一个匹配后停止

示例:在字符串 “ababab” 中,/ab/g 会匹配所有三个 “ab”

支持语言:JavaScript、PHP等

  • 可以看出来修饰符是由编程语言支持的,而不属于正则表达式的原生语法