正则表达式是繁琐的,但它是强大的。学会之后的应用会让你除了提高效率外,会给你带来绝对的成就感。
一、校验数字的表达式
| 场景 | 正则表达式 |
|---|---|
| 纯数字 | ^[0-9]*$ |
| n位数字 | ^\d{n}$ |
| 至少n位数字 | ^\d{n,}$ |
| m-n位数字 | ^\d{m,n}$ |
| 零和非零开头 | `^(0 |
| 非零开头最多2位小数 | ^([1-9][0-9]*)+(.[0-9]{1,2})?$ |
| 带1-2位小数的数 | ^(\-)?\d+(\.\d{1,2})?$ |
| 正数、负数、小数 | `^(- |
| 2位小数正实数 | ^[0-9]+(.[0-9]{2})?$ |
| 1-3位小数正实数 | ^[0-9]+(.[0-9]{1,3})?$ |
| 非零正整数 | ^[1-9]\d*$ 或 ^\+?[1-9][0-9]*$ |
| 非零负整数 | ^-[1-9]\d*$ |
| 非负整数 | ^\d+$ 或 `^[1-9]\d* |
| 非正整数 | `^-[1-9]\d* |
| 非负浮点数 | ^\d+(\.\d+)?$ |
| 非正浮点数 | `^((-\d+(.\d+)?) |
| 正浮点数 | `^[1-9]\d*.\d* |
| 负浮点数 | `^-([1-9]\d*.\d* |
| 浮点数 | ^(-?\d+)(\.\d+)?$ |
二、校验字符的表达式
| 场景 | 正则表达式 |
|---|---|
| 汉字 | ^[\u4e00-\u9fa5]{0,}$ |
| 英文和数字 | ^[A-Za-z0-9]+$ |
| 4-40位字符 | ^[A-Za-z0-9]{4,40}$ |
| 3-20位字符 | ^.{3,20}$ |
| 26个英文字母 | ^[A-Za-z]+$ |
| 26个大写字母 | ^[A-Z]+$ |
| 26个小写字母 | ^[a-z]+$ |
| 数字和字母 | ^[A-Za-z0-9]+$ |
| 字母、数字、下划线 | ^\w+$ 或 ^\w{3,20}$ |
| 中文、英文、数字、下划线 | ^[\u4E00-\u9FA5A-Za-z0-9_]+$ |
| 中文、英文、数字 | ^[\u4E00-\u9FA5A-Za-z0-9]+$ |
| 禁止特殊字符 | [^%&',;=?$\x22]+ |
三、特殊需求表达式
1. Email 邮箱
^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
// PHP 示例
$email = 'test@example.com';
$pattern = '/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/';
if (preg_match($pattern, $email)) {
echo "邮箱格式正确";
}
2. URL 网址
[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?
3. 手机号码(中国大陆)
^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|16[2|6]|17[0-8]|18[0-9]|19[0-9])d{8}$
// 宽松匹配 11 位手机号
function isValidPhone($phone) {
return preg_match('/^1[3-9]\d{9}$/', $phone);
}
4. 电话号码
^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
5. 身份证号码
// 15位或18位
^\d{15}|\d{18}$
// 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]$/
function isValidIdCard($id) {
if (strlen($id) == 18) {
return preg_match('/^[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]$/', $id);
} elseif (strlen($id) == 15) {
return preg_match('/^[1-9]\d{5}\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}$/', $id);
}
return false;
}
6. 账号(字母开头)
^[a-zA-Z][a-zA-Z0-9_]{4,15}$ // 5-16位
7. 密码强度
// 弱密码(字母开头,6-18位)
^[a-zA-Z]\w{5,17}$
// 强密码(大小写字母+数字,8-10位)
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
8. 日期格式
^\d{4}-\d{1,2}-\d{1,2}
9. 日期范围
// 12个月:01~09 和 1~12
^(0?[1-9]|1[0-2])$
// 31天:01~09 和 1~31
^((0?[1-9])|((1|2)[0-9])|30|31)$
10. 货币金额
// 10000.00 或 10,000.00
^[1-9][0-9]*$
// 不以0开头
^(0|[1-9][0-9]*)$
// 可选小数(必须2位)
^[0-9]+(.[0-9]{2})?$
// 允许千分位
^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$
四、常用场景正则
1. IP 地址
// 简单版
\d+\.\d+\.\d+\.\d+
// 严格版
((?:(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))
2. 腾讯 QQ 号
[1-9][0-9]{4,}
3. 中国邮政编码
[1-9]\d{5}(?!\d)
4. XML 文件
^([a-zA-Z]+-?)+[a-zA-Z0-9]+\.[x|X][m|M][l|L]$
5. 中文字符
[\u4e00-\u9fa5]
6. 双字节字符
[^\x00-\xff]
这一类「非 ASCII」写法常用来粗略匹配中文等宽字符;若要严格限定中日韓统一表意文字,可再配合 [\u4e00-\u9fff] 等 Unicode 区间。PHP 等对 UTF-8 文本建议使用带 u 修饰的正则。
7. 小结
以上条目均为常见写法模板,上线前务必用真实样本与边界数据回归测试;不同语言的正则方言(回溯、分支、贪婪性)会有差异,移植时请以目标引擎文档为准。