正则表达式速查表:常用Regex语法参考
正则表达式(Regular Expression,常简写为regex、regexp或RE)是一种强大的文本处理工具,它使用单个字符串来描述、匹配一系列符合特定语法规则的字符串。无论你是数据科学家、程序员、系统管理员,还是仅仅需要处理大量文本,掌握正则表达式都能极大地提高你的工作效率。本文将提供一个详细的正则表达式速查表,涵盖常用语法、示例和注意事项,助你快速上手并精通正则表达式。
一、基本字符和元字符
正则表达式由普通字符(例如字母、数字、标点符号)和特殊字符(称为“元字符”)组成。元字符赋予了正则表达式强大的匹配能力。
-
. (点号): 匹配除换行符
\n
之外的任何单个字符。- 示例:
a.c
可以匹配 “abc”, “aac”, “a1c”, 但不能匹配 “ac” (缺少一个字符) 或 “ab\nc” (包含换行符)。
- 示例:
-
\ (反斜杠): 转义字符。用于取消元字符的特殊含义,或引入特殊的字符类。
- 示例:
\.
匹配实际的点号字符 “.”,\\
匹配实际的反斜杠字符 “\”.\n
匹配换行符,\t
匹配制表符。
- 示例:
-
^ (插入符号): 匹配字符串的开头。 在字符集中表示否定。
- 示例:
^abc
匹配以 “abc” 开头的字符串。[^abc]
表示匹配除了 “a”, “b”, “c” 之外的任何单个字符。
- 示例:
-
$ (美元符号): 匹配字符串的结尾。
- 示例:
xyz$
匹配以 “xyz” 结尾的字符串。
- 示例:
-
| (管道符): 表示“或”关系。 匹配左侧或右侧的表达式。
- 示例:
cat|dog
匹配 “cat” 或 “dog”。
- 示例:
-
() (圆括号): 分组。 将多个字符组合成一个单元,也用于捕获匹配的内容,以便后续引用 (反向引用)。
- 示例:
(ab)+
匹配 “ab”, “abab”, “ababab” 等。([0-9]{3})-([0-9]{4})
可以匹配电话号码 “123-4567″,并将 “123” 和 “4567” 分别捕获到两个组中。
- 示例:
-
[] (方括号): 字符集。 匹配方括号中包含的任何单个字符。
- 示例:
[abc]
匹配 “a”, “b”, 或 “c”。[a-z]
匹配任何小写字母。[0-9]
匹配任何数字。[a-zA-Z0-9]
匹配任何字母或数字。
- 示例:
二、量词
量词用于指定一个模式应该重复多少次。
-
*
(星号): 匹配零次或多次。 贪婪匹配。- 示例:
ab*c
匹配 “ac”, “abc”, “abbc”, “abbbc” 等。
- 示例:
-
+
(加号): 匹配一次或多次。 贪婪匹配。- 示例:
ab+c
匹配 “abc”, “abbc”, “abbbc” 等,但不匹配 “ac”。
- 示例:
-
?
(问号): 匹配零次或一次。 贪婪匹配。 也可用于使量词变为非贪婪模式。- 示例:
ab?c
匹配 “ac” 或 “abc”。 - 非贪婪匹配:
a.*?b
匹配 “axxb” 中的 “axxb” 而不是 “a…b” (其中 “…” 可以代表任何字符)。
- 示例:
-
{n}
: 匹配恰好 n 次。- 示例:
a{3}
匹配 “aaa”。
- 示例:
-
{n,}
: 匹配至少 n 次。- 示例:
a{2,}
匹配 “aa”, “aaa”, “aaaa” 等。
- 示例:
-
{n,m}
: 匹配至少 n 次,但不超过 m 次。- 示例:
a{2,4}
匹配 “aa”, “aaa”, “aaaa”。
- 示例:
三、字符类
字符类用于匹配特定类型的字符。
-
\d
: 匹配任何数字字符 (等价于[0-9]
)。- 示例:
\d{3}
匹配 “123”, “456”, 等。
- 示例:
-
\D
: 匹配任何非数字字符 (等价于[^0-9]
)。- 示例:
\D+
匹配一个或多个非数字字符。
- 示例:
-
\w
: 匹配任何单词字符 (字母、数字和下划线,等价于[a-zA-Z0-9_]
)。- 示例:
\w+
匹配一个或多个单词字符,例如 “hello”, “world123”, “my_variable”。
- 示例:
-
\W
: 匹配任何非单词字符 (等价于[^a-zA-Z0-9_]
)。- 示例:
\W+
匹配一个或多个非单词字符,例如 ” “, “!”, “@#$”。
- 示例:
-
\s
: 匹配任何空白字符 (空格、制表符、换行符等)。- 示例:
\s+
匹配一个或多个空白字符。
- 示例:
-
\S
: 匹配任何非空白字符。- 示例:
\S+
匹配一个或多个非空白字符。
- 示例:
四、锚点
锚点用于匹配字符串中的特定位置,而不是实际的字符。
^
: 匹配字符串的开头 (前面已经提到)。$
: 匹配字符串的结尾 (前面已经提到)。-
\b
: 匹配单词边界。 单词边界是单词字符和非单词字符之间的位置。- 示例:
\bcat\b
匹配独立的单词 “cat”,但不匹配 “category” 或 “tomcat”。
- 示例:
-
\B
: 匹配非单词边界。- 示例:
\Bcat\B
匹配 “category” 中的 “cat”,但不匹配独立的单词 “cat”。
- 示例:
五、分组和反向引用
圆括号 ()
用于分组,并且允许捕获匹配的内容。 反向引用允许在正则表达式中引用先前捕获的组。
-
(...)
: 分组和捕获。- 示例:
(ab)+
匹配 “ab”, “abab”, “ababab” 等,并将 “ab” 捕获到一个组中。
- 示例:
-
\1
,\2
,\3
, …: 反向引用。 引用先前捕获的组。\1
引用第一个组,\2
引用第二个组,以此类推。- 示例:
(.)\1
匹配两个连续相同的字符,例如 “aa”, “bb”, “cc”。 第一个(.)
匹配任何单个字符,并将其捕获到第一个组中。\1
引用第一个组,所以它需要匹配与第一个组相同的内容。 - 示例:
(\w+)\s+\1
匹配重复的单词,例如 “the the”。(\w+)
匹配一个或多个单词字符,并将其捕获到第一个组中。\s+
匹配一个或多个空白字符。\1
引用第一个组,所以它需要匹配与第一个组相同的单词。
- 示例:
-
(?:...)
: 非捕获分组。 分组但不捕获。 这可以提高性能,尤其是在复杂的正则表达式中,如果不需要引用该组的内容。- 示例:
(?:ab)+
匹配 “ab”, “abab”, “ababab” 等,但不会将 “ab” 捕获到组中。
- 示例:
六、断言(零宽度断言)
断言是匹配位置而不是字符的非捕获组。 它们允许你根据周围的文本来确定是否应该匹配。
-
(?=...)
: 正向肯定预查。 匹配后面紧跟着...
的位置。- 示例:
\w+(?=ing)
匹配后面紧跟着 “ing” 的单词字符。例如,在 “playing, singing, dancing” 中,它将匹配 “play”, “sing”, “danc”。 但是,它不包括 “ing” 本身。
- 示例:
-
(?!...)
: 正向否定预查。 匹配后面 不 紧跟着...
的位置。- 示例:
\w+(?!ing)
匹配后面 不 紧跟着 “ing” 的单词字符。例如,在 “playing, singing, dancing, run” 中,它将匹配 “pla”, “sin”, “dan”, “run”。
- 示例:
-
(?<=...)
: 反向肯定预查。 匹配前面紧跟着...
的位置。...
的长度必须是固定的。- 示例:
(?<=abc)\w+
匹配前面紧跟着 “abc” 的单词字符。例如,在 “abcxyz” 中,它将匹配 “xyz”。
- 示例:
-
(?<!...)
: 反向否定预查。 匹配前面 不 紧跟着...
的位置。...
的长度必须是固定的.- 示例:
(?<!abc)\w+
匹配前面 不 紧跟着 “abc” 的单词字符。例如,在 “defxyz” 中,它将匹配 “defxyz”。
- 示例:
七、模式修饰符 (Flags)
模式修饰符用于改变正则表达式的行为。 它们通常放在正则表达式的末尾,例如 /pattern/i
. 具体支持的修饰符取决于编程语言或工具。 以下是一些常见的修饰符:
-
i
: 不区分大小写 (ignore case)。 使匹配忽略字母的大小写。- 示例:
/abc/i
可以匹配 “abc”, “Abc”, “ABC” 等。
- 示例:
-
g
: 全局匹配 (global)。 查找所有匹配项,而不是在找到第一个匹配项后停止。- 示例:
/abc/g
将在字符串中查找所有 “abc” 的匹配项。
- 示例:
-
m
: 多行模式 (multiline)。 使^
和$
匹配每一行的开头和结尾,而不仅仅是整个字符串的开头和结尾。- 示例: 如果字符串是 “abc\ndef\nghi”,
/^abc$/m
将匹配 “abc”,而没有m
修饰符,它将不会匹配。
- 示例: 如果字符串是 “abc\ndef\nghi”,
-
s
: 单行模式 (single line) 或 dotall 模式。 使.
(点号) 匹配包括换行符\n
在内的任何字符。- 示例: 如果字符串是 “abc\ndef”,
/a.d/s
将匹配 “abc\ndef”。 没有s
修饰符,它将不会匹配。
- 示例: 如果字符串是 “abc\ndef”,
-
x
: 忽略空白 (extended)。 允许在正则表达式中使用空白和注释,以提高可读性。- 示例:
regex
/
abc # 匹配 "abc"
def # 匹配 "def"
/x
这等价于/abcdef/
- 示例:
八、一些常用正则表达式示例
- 验证电子邮件地址:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
- 验证URL:
^(https?|ftp)://[^\s/$.?#].[^\s]*$
- 验证IP地址:
^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
- 验证日期 (YYYY-MM-DD):
^\d{4}-\d{2}-\d{2}$
- 提取HTML标签中的内容:
<[^>]+>([^<]+)<\/[^>]+>
- 删除字符串中的空白:
\s+
(然后用空字符串替换)
九、注意事项
- 贪婪与非贪婪匹配: 默认情况下,量词是贪婪的,这意味着它们会尽可能多地匹配字符。 可以使用
?
将量词变为非贪婪,使其尽可能少地匹配字符。 - 回溯 (Backtracking): 复杂的正则表达式可能会导致回溯,从而降低性能。 可以使用非捕获分组
(?:...)
或其他优化技巧来减少回溯。 - 不同语言/工具的差异: 正则表达式的语法和支持的特性在不同的编程语言和工具中可能略有不同。 请查阅相关文档以了解具体的差异。
- 可读性: 复杂的正则表达式可能会难以阅读和维护。 尽量编写简洁易懂的表达式,并添加注释进行解释。
- 测试: 使用在线正则表达式测试工具或编程语言提供的正则表达式库来测试你的表达式,确保它们能够正确匹配你想要的内容。
十、在线正则表达式测试工具推荐
- Regex101: 提供语法高亮、解释、测试和调试功能,支持多种编程语言。
- Regexr: 简洁易用的在线正则表达式测试工具,提供实时匹配结果和可视化图表。
- RegEx Pal: 支持多种正则表达式引擎,提供详细的匹配信息和性能分析。
通过掌握本文提供的正则表达式速查表,你将能够有效地使用正则表达式来处理各种文本处理任务。 记住,实践是学习正则表达式的关键。 多尝试,多测试,并参考相关文档,你将逐渐成为正则表达式高手!