普通字符
普通字符直接匹配与自身相同的字符。例如,正则表达式"abc"就可以匹配字符串"abc"中的这三个连续字符。注意:普通字符在匹配时区分大小写。
元字符
元字符是正则表达式中具有特殊含义的字符,它们赋予了正则表达式强大的模式匹配能力。以下是一些常见的元字符及其含义:
点号(.)
点号匹配除换行符(\n)之外的任意单个字符。例如,正则表达式 "a.c" 可以匹配 "abc"、"aec"、"a1c" 等字符串,但不能匹配 "a\nc"。
脱字符(^)
脱字符用于匹配字符串的开始位置。例如,正则表达式 "^abc" 表示匹配以 "abc" 开头的字符串,如 "abcdef"、"abc123" 等,但 "xabc" 则不会被匹配。
美元符号($)
美元符号用于匹配字符串的结束位置。
星号(*)
星号表示匹配其前面的字符或子表达式零次或多次。
加号(+)
加号表示匹配其前面的字符或子表达式一次或多次,即至少出现一次。
问号(?)
问号有两种含义:一是表示匹配其前面的字符或子表达式零次或一次,即可选出现;二是用于非贪婪匹配模式(后文会详细介绍)。
方括号([])
方括号用于定义一个字符集合,匹配该集合中的任意一个字符。方括号内还可以使用脱字符(^)表示取反,即匹配不在集合中的任意一个字符。例如,[^abc] 表示匹配除 a、b、c 之外的任意一个字符。
大括号({})
大括号用于指定其前面的字符或子表达式的出现次数。大括号内可以有一个数字,表示精确出现的次数;也可以有两个数字,用逗号分隔,表示出现次数的范围(左闭右闭)。例如,"a {3}" 表示匹配 a 恰好出现 3 次;"a {2,5}" 表示匹配 a 出现 2 到 5 次;"a {2,}" 表示匹配 a 至少出现 2 次;"a {,5}" 表示匹配 a 最多出现 5 次。
竖线(|)
竖线用于表示逻辑 “或” 关系,即匹配其左右两边的任意一个子表达式。
反斜杠(\)
反斜杠用于转义元字符,使其失去特殊含义,作为普通字符匹配。例如,如果要匹配点号(.)本身,就需要使用 ".";
此外,反斜杠还与一些字母组合形成预定义的字符类,例如:
\d:匹配任意一个数字,等价于 [0-9]。
\D:匹配任意一个非数字字符,等价于 [^0-9]。
\s:匹配任意一个空白字符(包括空格、制表符、换行符等),等价于 [\t\n\r\f\v]。
\S:匹配任意一个非空白字符,等价于 [^ \t\n\r\f\v]。
\w:匹配任意一个单词字符(包括字母、数字和下划线),等价于 [a-zA-Z0-9_]。
\W:匹配任意一个非单词字符,等价于 [^a-zA-Z0-9_]。
贪婪匹配与非贪婪匹配
在正则表达式中,默认情况下,量词(如 *、+、?、{} 等)是贪婪的,即尽可能多地匹配字符。例如,对于字符串 "aabbaabb",正则表达式 "a.b"会匹配整个字符串"aabbaabb",因为它会尽可能多地匹配中间的字符。而如果希望量词进行非贪婪匹配,即尽可能少地匹配字符,可以在量词后面加上问号(?)。此时,正则表达式"a.?b"会匹配第一个"a"和第一个"b"之间的内容,即"aab"。
忽略大小写匹配
在很多情况下,我们希望匹配字符时不区分大小写。可以通过在正则表达式中添加标志位来实现这一功能。不同的编程语言和工具使用的标志位可能有所不同。例如,在 Python 中,可以使用 re.IGNORECASE 标志(或简写为 re.I);在 JavaScript 中,可以在正则表达式末尾添加 "i" 标志。例如,正则表达式 "/abc/i" 可以匹配 "abc"、"ABC"、"AbC" 等。
多行匹配模式
默认情况下,正则表达式中的脱字符(^)和美元符号($)只匹配整个字符串的开始和结束位置。但在多行文本中,我们可能希望它们匹配每一行的开始和结束位置。这时可以使用多行匹配模式。例如,在Python中,使用re.MULTILINE标志(或简写为re.M);在JavaScript中,在正则表达式末尾添加"m"标志。