正则表达式的模式(Pattern)通常由以下几种元素构成:
字面值字符:直接匹配其自身的字符,例如字母、数字、空格等。
特殊字符:具有特定含义和功能的符号,例如 .、*、+、? 等。
字符类:使用方括号 [ ] 包围的字符集合,用于匹配集合内的任意一个字符。
元字符:用于匹配特定类型字符的简写代码,例如 \d(数字)、\w(单词字符)、\s(空白)等。
量词:限定前一个元素出现的次数或范围,例如 {n}、{n,}、+ 等。
边界符号:锚定匹配发生的位置,例如 ^(行首)、$(行尾)、\b(单词边界)。
普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。
数字和字母:直接匹配对应的字符本身。
| (逻辑或):匹配符号左侧 或 右侧的表达式。
示例:z|food 匹配 "z" 或 "food"。
示例:(z|f)ood 匹配 "zood" 或 "food"。
使用 [] 定义一个字符集合,匹配其中的任意一个字符。
| 语法 | 说明 | 示例 |
|---|---|---|
[abc*.] |
普通字符集。匹配集合内的任意字符。注意:在方括号内,* 和 . 等特殊符号通常失去特殊意义,仅代表符号本身。 |
匹配 a、b、c、* 或 . |
[a-z] |
小写字母范围。匹配任意一个小写字母。 | a 到 z |
[A-Z] |
大写字母范围。匹配任意一个大写字母。 | A 到 Z |
[0-9] |
数字范围。匹配任意一个数字,等效于 \d。 |
0 到 9 |
[^xyz] |
负值/排除字符集。匹配未包含在括号中的任意字符。 | [^abc] 可匹配 plain 中的 p, l, i, n |
锚点不匹配具体字符,而是匹配字符串中的位置。
| 符号 | 说明 | 示例 |
|---|---|---|
^ |
行首。匹配字符串或行的开始位置。 | ^Hello 匹配以 Hello 开头的行 |
$ |
行尾。匹配字符串或行的结束位置。 | World$ 匹配以 World 结尾的行 |
\b |
单词边界。匹配单词与空格(或标点/行首尾)之间的位置。 | er\b 匹配 "never" 中的 "er",但不匹配 "verb" |
\B |
非单词边界。匹配不处于单词边缘的位置。 | er\B 匹配 "verb" 中的 "er",但不匹配 "never" |
\< |
单词词首 (通常用于 Vi/Vim 或旧版 grep)。 | 匹配单词的开始位置 |
\> |
单词词尾 (通常用于 Vi/Vim 或旧版 grep)。 | 匹配单词的结束位置 |
使用圆括号 () 对模式进行分组,不仅可以控制运算优先级,还可以进行子表达式的捕获和预查。
(pattern):捕获匹配。
匹配 pattern 并将结果存储在缓冲区中。
引用方式:
正则内部引用:\1, \2...
外部替换引用:$1, $2... (JScript) 或 SubMatches (VBScript)。
注意:如果仅为了分组而不需要捕获,建议使用非捕获组以提高性能。
(?:pattern):非捕获匹配。
匹配 pattern 但不获取匹配结果,不进行存储。
用途:用于组合模式,例如 industr(?:y|ies) 比 industry|industries 更简洁,且不占用捕获组编号。
预查仅判断位置是否满足条件,不消耗字符(即匹配后,指针不后移,下一次匹配仍从当前位置开始)。
| 语法 | 类型 | 说明 | 示例 |
|---|---|---|---|
(?=pattern) |
正向肯定预查 | 在任何匹配 pattern 的字符串开始处匹配。 |
Windows(?=95\|98) 能匹配 "Windows95" 中的 "Windows",但不匹配 "Windows3.1" |
(?!pattern) |
正向否定预查 | 在任何不匹配 pattern 的字符串开始处匹配。 |
Windows(?!95\|98) 能匹配 "Windows3.1" 中的 "Windows",但不匹配 "Windows95" |
(?<=pattern) |
反向肯定预查 | 匹配处于 pattern 之后的位置。 |
(?<=95\|98)Windows 能匹配 "98Windows" 中的 "Windows" |
(?<!pattern) |
反向否定预查 | 匹配不处于 pattern 之后的位置。 |
(?<!95\|98)Windows 能匹配 "3.1Windows" 中的 "Windows" |
下表列出了常用的元字符及其含义。
| 符号 | 等价于 | 说明 |
|---|---|---|
\d |
[0-9] |
匹配一个数字字符。 |
\D |
[^0-9] |
匹配一个非数字字符。 |
\w |
[A-Za-z0-9_] |
匹配字母、数字、下划线 (Word character)。 |
\W |
[^A-Za-z0-9_] |
匹配非字母、数字、下划线。 |
\s |
[ \f\n\r\t\v] |
匹配任何空白字符 (空格、制表符、换页符等)。 |
\S |
[^ \f\n\r\t\v] |
匹配任何非空白字符。 |
\t |
\x09 |
匹配一个制表符 (Tab)。 |
\n |
\x0a |
匹配一个换行符 (Newline)。 |
\r |
\x0d |
匹配一个回车符 (Carriage Return)。 |
\f |
\x0c |
匹配一个换页符。 |
\v |
\x0b |
匹配一个垂直制表符。 |
\cx |
- | 匹配由 x 指明的控制字符。例如 \cM 匹配 Control-M (回车)。x 必须为 A-Z 或 a-z。 |
\xn |
- | 匹配十六进制转义值 n (两个数字)。例:\x41 匹配 "A"。 |
\un |
- | 匹配 Unicode 字符 n (四个十六进制数字)。例:\u00A9 匹配 "©"。 |
\num |
- | 反向引用。匹配第 num 个捕获组的内容。例:(.)\1 匹配两个连续相同的字符。 |
\n:如果 n 是 0-7,且之前少于 n 个捕获组,则表示八进制转义。
\nm:如果是八进制数字,匹配八进制值 nm;否则可能是向后引用。
\nml:如果 n (0-3) 且 m,l (0-7),匹配八进制值 nml。
量词指定前面的字符或子表达式出现的次数。
| 贪婪量词 | 说明 | 等价形式 |
|---|---|---|
* |
匹配前面的子表达式 零次或多次。 | {0,} |
+ |
匹配前面的子表达式 一次或多次。 | {1,} |
? |
匹配前面的子表达式 零次或一次。 | {0,1} |
{n} |
匹配前面的子表达式 恰好 n 次。 | - |
{n,} |
匹配前面的子表达式 至少 n 次。 | - |
{n,m} |
匹配前面的子表达式 n 到 m 次。 | - |
提示:上述量词默认为贪婪匹配(尽可能多地匹配)。若在量词后加上
?(如*?,+?,??),则变为非贪婪匹配(尽可能少地匹配)。
当需要匹配某些具有特殊含义的元字符(如 *, ., ? 等)本身时,需要在其前面加上反斜杠 \ 进行转义。
\* 匹配 * 字符
\. 匹配 . 字符
\/ 匹配 / 字符
\\ 匹配 \ 字符
\[ 匹配 [ 字符
\] 匹配 ] 字符
\( 和 \) 匹配圆括号字符
Vi/Vim 编辑器使用的正则表达式语法与标准正则略有不同,主要体现在捕获组和特殊字符的转义上。
分组捕获:不使用 (),而是使用 \( 和 \)。
字符集:[] 用法相同,其中内容可选。
基本格式:
:[range]s/pattern/replacement/[flags]
如果不指定范围,默认作用于当前行。
:10s/from/to/:仅在第 10 行进行替换。
:1,10s/from/to/:在第 1 到第 10 行(含)之间替换。
:%s/from/to/:在所有行中搜索替换(% 代表全文)。
:1,$s/from/to/:同上($ 代表最后一行)。
保留/删除:
:v/pattern/d:删除不包含 pattern 的行 (invert match)。
:g/pattern/d:删除包含 pattern 的行 (global match)。
选项可以合并使用,例如 cgi。
| 标记 | 含义 | 说明 |
|---|---|---|
g |
Global | 全局替换。若不加 g,只替换每行第一个匹配项。 |
c |
Confirm | 确认模式。每次替换前询问用户。 |
i |
Ignore Case | 忽略大小写。 |
e |
Error | 不显示错误信息。 |
m |
Multi-line | 多行匹配。使 ^ 和 $ 匹配每行的开头和结尾,而非整个缓冲区的开头结尾。 |
s |
Single-line | 单行模式(即“点号通配”)。使 . 可以匹配换行符 \n。 |