本文系统介绍了正则表达式的核心概念和语法规则,通过分类整理和详细示例,讲解了如何使用这套精密模式描述语言进行文本匹配。
一、正则表达式基础概念
什么是正则表达式?
正则表达式(Regular Expression,常简写为 regex、regexp 或 RE)不是某个软件的专属功能,也不是某个编程语言的特定语法,而是一种用于描述字符串匹配规则的特殊文本模式。
正则表达式的组成元素
正则表达式由普通字符(如字母 a、数字 1、字符 @)和特殊字符(称为“元字符”,如 .、*、?、[]、^、$)组成,形成一种简洁而强大的模式描述语言,常用于验证用户输入、提取日志信息、批量处理文本等。例如:
^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$
上面是一个匹配邮箱地址的正则表达式,它由以下元素组成:
- • 字符类:
[A-Za-z0-9._%+-] 匹配指定范围内的字符;
二、基础语法:从简单到复杂
字面匹配:最基础的匹配方式
字面匹配是最基本的匹配形式,直接匹配字符本身。
【注】转义特殊字符与转义
某些字符在正则表达式中有特殊含义,需要转义才能匹配自身。
字符类:匹配一组字符
字符类匹配一组字符中的任意一个。
| |
|---|
[abc] | |
[^abc] | |
[a-z] | |
[A-Z] | |
[0-9] | |
[a-zA-Z] | |
[0-9a-fA-F] | |
预定义字符类:常用集合的简写
大多数正则表达式实现提供常用字符类的简写形式,即预定义字符类。
| | |
|---|
\d | [0-9] | |
\D | [^0-9] | |
\w | [A-Za-z0-9_] | |
\W | [^A-Za-z0-9_] | |
\s | [ \t\n\r\f] | |
\S | [^ \t\n\r\f] | |
. | [^\n] | |
位置匹配:锚定边界
位置匹配(或称锚点)不匹配具体字符,而是匹配字符之间的位置。
| | | |
|---|
^ | | ^Hello | |
$ | | world$ | |
\b | | \bcat\b | |
\B | | \Bcat\B | |
\A | | \AStart | |
\Z | | end\Z | |
\z | | end\z | |
量词:控制匹配次数
量词控制前面元素的匹配次数,即用于重复匹配。
| | | |
|---|
? | | colou?r | |
* | | ab*c | |
+ | | ab+c | |
{n} | | a{3} | |
{n,} | | a{2,} | |
{n,m} | | a{2,4} | |
【注】贪婪匹配和非贪婪匹配
贪婪匹配和非贪婪匹配是控制量词(如*、+、?、{n,m})匹配行为的两种模式。在匹配时,贪婪匹配是“尽可能多”地匹配,而非贪婪匹配则是“尽可能少”地匹配。关键在于,非贪婪模式会在量词后面加上一个问号?(如 *?、+?、??、{n,m}?)。例如:
- • 贪婪匹配:
<.*> 可以匹配整个字符串 <div>内容</div>; - • 非贪婪匹配:
<.*?> 只能分别匹配 <div> 和 </div>。
分组与选择
分组() 将多个元素组合为一个单元,便于应用量词或捕获。
非捕获分组(?:) 可以只进行分组但不捕获,这样可以避免捕获不必要的匹配内容,让匹配速度更快、资源消耗更低。
选择| 可以匹配多个模式中的任意一个。
| | | |
|---|
() | | (ab)+ | |
(?:) | | (?:ab)+ | |
| | | cat|dog | |
三、小结
正则表达式是一种用于描述文本模式的强大语言,由普通字符和具有特殊含义的元字符(如.、*、[]、^、$等)组合而成。它通过字符类匹配特定集合,用量词控制重复次数,用锚点定位边界,并用分组构建复杂规则。掌握正则表达式,就是学会用这套简洁而强大的语法,将模糊的文本搜索需求转化为精确的模式描述。
此番炼器手札,炉火尚未全熄。若道友观之有趣,或可暂留此间,结一尘缘。待下回开炉铸器,新得感悟,必先与同道分享。