4 min read

Regex (正则表达式) 常用语法大全

Table of Contents

正则表达式(Regular Expression,简称 Regex)是用于处理字符串的强大工具。无论是数据验证、搜索替换还是文本解析,掌握 Regex 都能让你事半功倍。以下是一份常用的 Regex 语法速查表。


1. 基础字符与元字符

符号说明示例匹配结果
.匹配除换行符以外的任意单个字符a.c”abc”, “a@c”
\转义字符,用于匹配保留字符\.”.”
``逻辑或 (OR)`cat

2. 字符类 (Character Classes)

符号说明
[abc]匹配方括号内的任意一个字符 (a 或 b 或 c)
[^abc]匹配除了方括号内字符以外的任意字符
[a-z]匹配任意小写字母
[A-Z]匹配任意大写字母
[0-9]匹配任意数字
\w匹配任意单词字符 (字母、数字、下划线),等价于 [a-zA-Z0-9_]
\W匹配任意单词字符
\d匹配任意数字,等价于 [0-9]
\D匹配任意数字
\s匹配任意空白字符 (空格、制表符、换行符)
\S匹配任意空白字符

3. 量词 (Quantifiers)

用来指定前面的字符出现的次数。

符号说明示例
*匹配 0 次或多次a* (匹配 "", “a”, “aa”)
+匹配 1 次或多次a+ (匹配 “a”, “aa”)
?匹配 0 次或 1 次 (可选)colou?r (匹配 “color”, “colour”)
{n}匹配恰好 n 次\d{3} (匹配 “123”)
{n,}匹配至少 n 次\d{2,} (匹配 “12”, “123”)
{n,m}匹配 n 到 m 次\d{2,4} (匹配 “12”, “123”, “1234”)

注意:默认情况下量词是贪婪的(尽可能多匹配)。在量词后加 ? 可变为懒惰模式(尽可能少匹配),如 .*?


4. 边界与定位 (Anchors)

符号说明
^匹配字符串的开头
$匹配字符串的结尾
\b匹配单词边界 (Word Boundary)
\B匹配非单词边界

5. 分组与引用 (Groups & References)

符号说明示例
(...)捕获组 (Capturing Group)(abc)
(?:...)非捕获组 (Non-capturing Group)(?:abc)
\1引用第一个捕获组匹配的内容(a)\1 (匹配 “aa”)
(?<name>...)命名捕获组(?<year>\d{4})

6. 断言 (Lookaround)

用于根据周围环境匹配字符,但不消耗字符(即不包含在匹配结果中)。

符号说明示例
(?=...)正向先行断言 (存在)a(?=b) (匹配后面紧跟 b 的 a)
(?!...)负向先行断言 (不存在)a(?!b) (匹配后面紧跟 b 的 a)
(?<=...)正向后行断言 (存在)(?<=b)a (匹配前面紧跟 b 的 a)
(?<!...)负向后行断言 (不存在)(?<!b)a (匹配前面紧跟 b 的 a)

7. 常用标志 (Flags)

在 JS 等语言中,正则通常写作 /pattern/flags

标志说明
g全局匹配 (Global)
i忽略大小写 (Case Insensitive)
m多行模式 (Multiline),^$ 匹配每一行的开头结尾
s点号通配模式 (Dotall),. 可以匹配换行符

8. 常用实例 (Common Patterns)

邮箱验证

^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$

手机号 (简单版)

^1[3-9]\d{9}$

URL 匹配

https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)

日期 (YYYY-MM-DD)

^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$

匹配中文字符

[\u4e00-\u9fa5]

身份证 (中国大陆)

  • 18位身份证 (校验日期与最后一位):
^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$
  • 15位或18位 (简单版):
^(?:\d{15}|\d{18}|\d{17}[\dXx])$

IPv4 地址

^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$

强密码

规则:至少8位,包含大小写字母和数字,可选特殊字符。

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d@$!%*?&]{8,}$