正则 - 表达式 - 正则表达式速查

💡 常用工具:regex101.com、regexr.com

🔤 字符类

模式说明示例
.任意字符(换行符除外)a.c → abc, aXc
\d数字\d{3} → 123
\D非数字\D+ → abc
\w字母数字下划线\w+ → hello_1
\W非字母数字\W → @#$
\s空白字符(空格 tab 换行)a\sb → a b
\S非空白\S+ → abc
[abc]字符集[aeiou] → 元音
[^abc]排除[^0-9] → 非数字
[a-z]范围小写字母

⏱️ 量词

量词说明示例
*0 次或多次ab* → a, ab, abb
+1 次或多次ab+ → ab, abb
?0 次或 1 次colou?r → color, colour
{n}恰好 n 次\d{4} → 2024
{n,}至少 n 次\d{2,} → 12, 123
{n,m}n 到 m 次\d{2,4} → 12, 123, 1234
*?非贪婪(最少).*? → 尽可能少匹配
+?非贪婪.+?

🪝 锚点

锚点说明示例
^字符串开头^hello → hello world
$字符串结尾world$ → hello world
\b单词边界\bword\b → 完整单词
\B非单词边界 

👥 分组

模式说明示例
(abc)捕获组(ab)+ → abab
(?:abc)非捕获组(?:ab)+
(?<name>abc)命名组(?<year>\d{4})
\1反向引用(\w)\1 → aa, bb
(a|b)选择(cat|dog) → cat, dog

🔍 断言

断言说明示例
(?=abc)正向先行\d(?=px) → 5p → 5
(?!abc)负向先行\d(?!px) → 5em → 5
(?<=abc)正向后行(?<=\$)\d+ → $100 → 100
(?<!abc)负向后行(?<!\$)\d+ → 100$

🛠️ 常用模式

# 中国手机号
1[3-9]\d{9}

# 邮箱
[\w.-]+@[\w.-]+\.\w+

# 身份证号(18位)
[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]

# URL
https?://[\w.-]+(/[\w./-]*)?)

# IPv4
\b(?:\d{1,3}\.){3}\d{1,3}\b

# 日期 YYYY-MM-DD
\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])

# 时间 HH:MM:SS
(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d

# 中文
[\u4e00-\u9fa5]+

# 密码(字母+数字+特殊字符,8位以上)
^(?=.*[a-zA-Z])(?=.*\d)(?=.*[!@#$%^&*]).{8,}

# QQ号
[1-9]\d{4,10}

# 微信号
^[a-zA-Z][\w-]{5,19}$

# 银行卡号
\d{16,19}

# HTML 标签
<([a-z]+)[^>]*>.*?</\1>

🖥️ 常用命令

# grep 过滤
grep -E '\d+' file.txt
grep -o '[0-9]\+' file.txt

# sed 替换
sed -E 's/(\d{4})-(\d{2})-(\d{2})/\3\/\2\1/' file.txt

# find
find . -name '*.txt' -regex '.*[0-9]+\.txt'

# 批量重命名
rename 's/(\d+)_(\d+)/$2_$1/' *.txt

🐍 Python 示例

import re

text = '手机: 13812345678, 邮箱: test@example.com'

# 匹配
phone = re.search(r'1[3-9]\d{9}', text)
print(phone.group())  # 13812345678

# 查找所有
emails = re.findall(r'[\w.-]+@[\w.-]+\.\w+', text)
print(emails)  # ['test@example.com']

# 替换
new_text = re.sub(r'\d{3}\d{4}\d{4}', '***-****-****', text)

# 分割
parts = re.split(r'[,,]', 'a,b,c,d')

# 命名组
m = re.search(r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})', '2024-01-15')
print(m.group('year'))  # 2024

# 编译复用
pattern = re.compile(r'\d+')
pattern.findall(text)

文档信息

Search

    Table of Contents