正则表达式(Regular Expression,简称regex)是用于匹配字符串的一种模式,广泛应用于文本处理、数据验证、搜索和替换等场景。它通过一种特殊的语法来描述一个字符串集合,可以非常灵活地表示各种复杂的字符串格式。
1. **基础概念**:
- **字符类**:例如 `[abc]` 表示匹配 'a'、'b' 或 'c' 中的任意一个字符。
- **量词**:`*` 表示前面的字符出现零次或多次,`+` 表示至少一次,`?` 表示零次或一次,`{n}` 表示恰好 n 次,`{n,}` 表示至少 n 次,`{n,m}` 表示介于 n 和 m 次之间。
- **边界**:`\b` 表示单词边界,`^` 表示行首,`$` 表示行尾。
- **转义字符**:`\` 用于转义特殊字符,如 `\.` 表示匹配实际的点号 '.'。
2. **元字符与预定义字符集**:
- `.`:匹配除换行符外的任何单个字符。
- `\d`:匹配数字 [0-9]。
- `\D`:匹配非数字字符。
- `\w`:匹配字母、数字或下划线 [A-Za-z0-9_]。
- `\W`:匹配非字母、数字或下划线的字符。
- `\s`:匹配任何空白字符,包括空格、制表符、换页符等。
- `\S`:匹配任何非空白字符。
3. **分组与捕获**:
- `( )`:用于创建分组,可以捕获匹配的部分,便于后续处理或引用。
- `\1`、`\2` 等:引用前面的分组内容,`\1` 是第一个分组,`\2` 是第二个分组。
4. **选择与否定**:
- `|`:表示或操作,例如 `cat|dog` 可以匹配 'cat' 或 'dog'。
- `[^abc]`:匹配除了 'a'、'b' 和 'c' 之外的任何字符。
5. **预查与后查**:
- `(?=pattern)`:正向前瞻,确保后面跟着指定的模式。
- `(?!pattern)`:负向前瞻,确保后面不跟着指定的模式。
6. **重复与贪婪与非贪婪**:
- `*?`、`+?`、`??`、`{n,}?`、`{n,m}?`:这些是懒惰量词,只匹配尽可能少的字符,与贪婪量词 (`*`、`+`、`?`、`{n,}`、`{n,m}`) 相反。
7. **零宽断言**:
- `(?=pattern)`:正向先行断言,检查当前位置后面是否能匹配 pattern,但不消耗字符。
- `(?!pattern)`:负向先行断言,检查当前位置后面不能匹配 pattern。
- `(?<=pattern)`:正向后行断言,检查当前位置前面是否匹配 pattern。
- `(?<!pattern)`:负向后行断言,检查当前位置前面不能匹配 pattern。
8. **修饰符**:
- `i`:使匹配对大小写不敏感。
- `g`:全局匹配,找到所有匹配,而不仅仅是第一个。
- `m`:多行模式,使 `^` 和 `$` 分别匹配每一行的开头和结尾。
正则表达式的应用广泛,从简单的字符串查找替换,到复杂的输入验证,再到数据提取和文本分析,都离不开它的身影。熟练掌握正则表达式能极大地提高处理文本的能力和效率。在不同的编程语言中,如JavaScript、Python、Java等,正则表达式的实现可能会有所不同,但基本的语法和概念是相通的。在实际使用时,根据具体语言的文档进行学习和实践是非常必要的。