正则表达式
正则表达式(Regular Expression,简称Regex)是一种描述文本模式的符号化语言,用于在字符串中高效地匹配、搜索、替换或提取符合特定规则的文本内容。
不同的正则表达式引擎支持的语法和功能不同,总结起来可以分为三类:BRE(Basic Regular Expression基础正则表达式)、ERE(Extend Regular扩展正则表达式)、PCRE(Perl Compatible Regular Expressions Perl 兼容正则表达式)
关于BRE、ERE、PCRE有一些常见的问题:
- “ERE 是 BRE 的超集”
- 部分正确:ERE 支持 BRE 的所有功能,但语法不同(如
\+
vs+
)。 - 例外:BRE 的
\|
在 ERE 中是字面|
,需用|
表示或。
- 部分正确:ERE 支持 BRE 的所有功能,但语法不同(如
- “PCRE 是唯一支持高级功能的引擎”
- 不完全正确:其他引擎(如 Java 的
java.util.regex
)也支持类似功能,但语法不同。
- 不完全正确:其他引擎(如 Java 的
- “所有工具都支持 PCRE”
- 错误:
sed
、grep
默认不支持,需特定版本或选项(如grep -P
)。
- 错误:
强烈推荐一个网站: https://regex101.com,不仅可以进行验证表达式匹配问题,还可以进行表达式引擎支持功能查询
核心功能
- 匹配:判断字符串是否符合某种模式(如验证邮箱格式)。
- 搜索:在文本中定位符合模式的子串(如提取日志中的IP地址)。
- 替换:批量修改符合模式的文本(如清理HTML标签)。
- 提取:从结构化/非结构化文本中提取关键信息(如解析JSON中的字段)。
核心语法
- 字符匹配:
.
匹配任意单个字符(如a.b
匹配acb
、a1b
)。[abc]
匹配字符组中的任意一个(如[0-9]
匹配数字)。
- 量词控制:
*
匹配前一个字符0次或多次(如a*
匹配""
、a
、aaa
)。+
匹配1次或多次,?
匹配0次或1次(如a+b?
匹配a
、ab
、aaa
)。
- 边界与分组:
^
和$
分别匹配字符串开头和结尾(如^hello$
仅匹配完整字符串hello
)。()
用于分组,\1
、\2
可引用捕获的分组(如(\d{3})-\1
匹配123-123
)。
应用场景
- 数据验证:
- 邮箱格式:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
- 密码强度:
^(?=.*[A-Z])(?=.*\d).{8,}$
(至少8位,含大写字母和数字)
- 邮箱格式:
- 文本处理:
- 清理多余空格:
\s+
→ (将多个空格替换为单个空格)。 - 提取日期:
(\d{4})-(\d{2})-(\d{2})
(捕获年、月、日)。
- 清理多余空格:
- 工具集成:
- 编辑器(VS Code):批量替换代码中的重复模式。
- 命令行(grep/sed):日志分析、文件搜索。
为什么需要正则表达式?
- 效率:一行正则可能替代数百行循环代码。
- 灵活性:适应动态变化的文本模式。
- 跨语言:Python、JavaScript、Java等主流语言均支持。
总结:正则表达式是文本处理的“瑞士军刀”,掌握它能让开发者在处理字符串时事半功倍!