悠悠楠杉
十分钟上手正则表达式(下篇)
十分钟上手正则表达式(下篇)
在上一篇中,我们初步介绍了正则表达式的概念、基本语法以及如何进行简单的匹配和搜索。本篇将深入探讨正则表达式的进阶用法,包括复杂模式匹配、分组与引用、非贪婪匹配、正向预查与反向预查等高级特性。让我们继续踏上正则表达式的学习之旅,为更高效的文本处理做好准备。
复杂模式匹配
1. 字符类匹配与选择
正则表达式中的字符类[...]
允许你匹配方括号内的任何一个字符。例如,[abc]
可以匹配'a'、'b'或'c'。如果你需要匹配任意一个数字,可以使用[0-9]
。
示例: 匹配一个单词由两个大写字母组成,可以是'A'或'B'开头。
regex
^[AB][A-Z]
2. 排除型字符类
使用[^...]
可以匹配不在方括号内的任何字符。例如,[^a-z]
可以匹配任何非小写字母的字符。
示例: 匹配不以'a'开头且不包含小写字母的单词。
regex
[^a][^a-z]*[A-Z]
分组与引用
1. 分组(Capturing Groups)
使用圆括号(...)
可以将一个或多个字符作为一个整体进行匹配或引用。例如,(\w+)
可以匹配一个或多个单词字符并捕获这个整体。
示例: 提取URL中的协议和主机名。
regex
(\w+)://([^/]+)
这里\w+
匹配协议(如http),://
是字面量,([^/]+)
匹配并捕获URL的主机名部分。
2. 引用(Backreferences)
你可以在正则表达式中引用之前捕获的分组,通过\n
(n为分组号)实现。这常用于检查模式是否重复出现或进行复杂的结构化匹配。
示例: 验证一个字符串是否为回文(正读和反读相同的字符串)。
regex
^(.)(?:(?!.*\1).)*\1$
这里,\1
引用第一个分组(即开头的第一个字符),确保整个字符串除了这个字符外没有其他重复的字符。
非贪婪匹配
默认情况下,正则表达式的量词(如*
, +
, ?
, {n,m}
)是贪婪的,会尽可能多地匹配字符。使用?
可以将其转换为非贪婪模式,即尽可能少地匹配字符。
示例: 从HTML中提取第一个链接的URL,但仅到第一个出现的双引号为止。
regex
<a href="([^"]*)"
这里加上?
使*
变为非贪婪模式,确保只匹配到第一个双引号前的URL部分。
正向预查与反向预查
1. 正向预查(Positive Lookahead) (?=...)
正向预查用于声明随后的模式必须出现,但不会消耗任何字符(即不会作为结果的一部分)。这有助于进行“此之后必须跟随...”的验证。
示例: 验证一个单词是否以'vow'开头后跟一个元音字母。
regex
\bvow(?=[aeiou])\w*
这里,(?=[aeiou])
是一个正向预查,确保后面是元音字母。
2. 反向预查(Negative Lookahead) (?!...)
与正向预查相反,反向预查用于声明随后的模式不得出现。它同样不消耗字符。这在进行排除性验证时非常有用。
示例: 匹配不包含'ing'作为结尾的单词。 regex \b(?!ing\b)\w*
这里,(?!ing\b)
是一个反向预查,确保整个单词不以'ing'结尾。