正则表达式入门:如何编写正则表达式
正则表达式入门
正则表达式——regex——是描述文本的模式。借助正则表达式,你可以搜索字符串、校验输入、提取数据,并用一条紧凑的表达式完成复杂的查找与替换。一旦掌握了基础知识,正则表达式将成为你编程工具箱中最强大的工具之一。
什么是正则表达式?
正则表达式是定义搜索模式的一串字符。模式 \d{3}-\d{2}-\d{4} 可匹配美国社会安全号码:三位数字、连字符、两位数字、连字符、四位数字。
几乎所有编程语言都内置了正则表达式引擎——JavaScript、Python、Java、Ruby、Go 等。
字面字符
大多数字符都会匹配其本身。模式 cat 无论出现在哪里,都匹配字符串 "cat"。
Pattern: cat
Matches: "cat" in "The cat sat on the mat."
Matches: "cat" in "catalog"
字面匹配虽然简单,但能力有限。真正的威力来自元字符。
元字符
以下字符具有特殊含义,若要按字面意义匹配,必须使用 \ 进行转义:
. ^ $ * + ? { } [ ] \ | ( )
字符类
字符类用于匹配一个集合中的单个字符。
方括号记法
| 模式 | 匹配 |
|---------|---------|
| [aeiou] | 任意元音 |
| [0-9] | 任意数字 |
| [a-zA-Z] | 任意字母 |
| [^0-9] | 任意非数字字符 |
预定义字符类
| 简写 | 说明 |
|-----------|-------------|
| \d | 任意数字(等同于 [0-9]) |
| \w | 字母、数字或下划线 |
| \s | 空格、制表符、换行符 |
| \D | 任意非数字 |
| \W | 任意非单词字符 |
| \S | 任意非空白字符 |
| . | 除换行符以外的任意字符 |
量词
量词控制前面的元素必须出现的次数。
| 量词 | 含义 | 示例 | 匹配 |
|------------|---------|---------|---------|
| * | 零次或多次 | a* | "", "a", "aa" |
| + | 一次或多次 | a+ | "a", "aa", "aaa" |
| ? | 零次或一次 | colou?r | "color", "colour" |
| {3} | 恰好 N 次 | \d{3} | "123" |
| {2,4} | 在 N 到 M 次之间 | \d{2,4} | "12", "123", "1234" |
示例
\d+ → "42" in "Answer is 42"
https?:// → "http://" and "https://"
锚点
锚点匹配的是位置,而非字符。
| 锚点 | 含义 |
|--------|---------|
| ^ | 字符串开头 |
| $ | 字符串结尾 |
| \b | 单词边界 |
| \B | 非单词边界 |
^hello → matches "hello" only at the start
end$ → matches "end" only at the end
\bword\b → matches "word" as a whole word, not inside "sword"
分组与选择
捕获组 ( ) 用于提取匹配的部分:
(\d{3})-(\d{4}) → "555-1234", captures "555" in group 1, "1234" in group 2
非捕获组 (?: ) 用于分组但不提取内容:
(?:https?|ftp):// → "http://", "https://", "ftp://"
选择 | 相当于 OR(或):
cat|dog|bird → matches "cat", "dog", or "bird"
实用正则表达式示例
| 用途 | 模式 |
|----------|---------|
| 美国电话号码 | \d{3}-\d{3}-\d{4} |
| 电子邮件(简单) | \S+@\S+\.\S+ |
| IP 地址 | \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} |
| 话题标签 | #[a-zA-Z]\w* |
| 时间(HH:MM) | [01]\d|2[0-3]:[0-5]\d |
如何测试正则表达式模式
务必交互式地测试模式:
- 输入你的正则表达式模式。
- 输入测试字符串。
- 实时查看哪些部分匹配。
- 调整后重复测试。
使用正则表达式测试工具来试验各种模式。它会高亮匹配结果、显示捕获组,并帮助你准确理解表达式每一部分的作用。