目录
  1. 1. 概述
  2. 2. 基本语法
    1. 2.1. 修饰符
    2. 2.2. 元字符
    3. 2.3. 方括号
    4. 2.4. 量词
    5. 2.5. 断言
  3. 3. 常用实例
    1. 3.1. 校验数字的表达式
    2. 3.2. 校验字符的表达式
    3. 3.3. 特殊需求表达式
  4. 4. 参考资料

【个人总结】正则表达式语法及常用正则

项目中常用正则表达式来进行校验,然而确实总是遗忘一些相关的语法,需要谷歌搜索一些不太好想或写的正则规则。所以在此总结一份。争取依靠个人总结不断更新这篇日志,节约之后 90% 的查阅搜索时间。

概述

正则表达式就是事先声明一组规则,用于匹配字符串中的字符。

基本语法

修饰符

修饰符 描述
i 执行对大小写不敏感的匹配。
g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m 执行多行匹配。

元字符

在正则表达式的模式中,有一些字符是有特殊含义的,被称为元字符。元字符都是针对单个字符匹配的。

元字符 描述
. 查找单个字符,除了换行和行结束符。
\w 匹配大小写英文字符及数字 0 到 9 之间的任意一个及下划线,相当于 [a-zA-Z0-9_]
\W 不匹配大小写英文字符及数字 0 到 9 之间的任意一个,相当于 [^a-zA-Z0-9_]
\s 匹配任何空白字符,相当于 [\f\n\r\t\v]
\S 匹配任何非空白字符,相当于 [^\s]
\d 匹配任何 0 到 9 之间的单个数字,相当于 [0-9]
\D 不匹配任何 0 到 9 之间的单个数字,相当于 [^0-9]
\b 匹配单词边界。
\B 匹配非单词边界。
\0 查找 NUL 字符。
\n 查找换行符。
\f 查找换页符。
\r 查找回车符。
\t 查找制表符。
\v 查找垂直制表符。
\xxx 查找以八进制数 xxx 规定的字符。
\xdd 查找以十六进制数 dd 规定的字符。
[\u4e00-\u9fa5] 匹配任意单个汉字(这里用的是 Unicode 编码表示汉字的 )
^ 匹配字符串的开头
$ 匹配字符串的结尾

方括号

方括号用于查找某个范围内的字符

表达式 描述
[...] 匹配方括号中的所有字符
[^...] 匹配非方括号中的所有字符

量词

表达式 描述
n* 匹配任何包含零个或多个 n 的字符串。
n+ 匹配任何包含至少一个 n 的字符串。
n? 匹配任何包含零个或一个 n 的字符串。
n{X} 匹配包含 X 个 n 的序列的字符串。
n{X,Y} 匹配包含 X 或 Y 个 n 的序列的字符串。
n{X,} 匹配包含至少 X 个 n 的序列的字符串。
n$ 匹配任何结尾为 n 的字符串。
^n 匹配任何开头为 n 的字符串。
?=n 匹配任何其后紧接指定字符串 n 的字符串。
?!n 匹配任何其后没有紧接指定字符串 n 的字符串。

断言

表达式 描述
(exp) 匹配 exp,并捕获文本到自动命名的组里
(?exp) 匹配 exp,并捕获文本到名称为 name 的组里,也可以写成(?'name'exp)
(?:exp) 匹配 exp,不捕获匹配的文本,也不给此分组分配组号
(?=exp) 正向先行断言——代表字符串中的一个位置,紧接该位置之后的字符序列能够匹配 exp。
(?!exp) 负向先行断言——代表字符串中的一个位置,紧接该位置之后的字符序列不能匹配 exp
(?<=exp) 正向后行断言,代表字符串中的一个位置,紧接该位置之前的字符序列能够匹配 exp。
(?<!exp) 负向后行断言,代表字符串中的一个位置,紧接该位置之前的字符序列不能匹配 exp。
(?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

常用实例

校验数字的表达式

  • 数字:^[0-9]*$

  • n 位的数字:^\d{n}$

  • 至少 n 位的数字:^\d{n,}$

  • m-n 位的数字:^\d{m,n}$

  • 零和非零开头的数字:^(0|[1-9][0-9]*)$

  • 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$

  • 带 1-2 位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$

  • 正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$

  • 有两位小数的正实数:^[0-9]+(.[0-9]{2})?$

  • 有 1~3 位小数的正实数:^[0-9]+(.[0-9]{1,3})?$

  • 非零的正整数:^[1-9]\d*$^([1-9][0-9]*){1,3}$^\+?[1-9][0-9]*$

  • 非零的负整数:^\-[1-9][]0-9"*$^-[1-9]\d*$

  • 非负整数:^\d+$^[1-9]\d*|0$

  • 非正整数:^-[1-9]\d*|0$^((-\d+)|(0+))$

  • 非负浮点数:^\d+(\.\d+)?$^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$

  • 非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$

  • 正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$

  • 负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$

  • 浮点数:^(-?\d+)(\.\d+)?$^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

校验字符的表达式

  • 汉字:^[\u4e00-\u9fa5]{0,}$

  • 英文和数字:^[A-Za-z0-9]+$^[A-Za-z0-9]{4,40}$

  • 长度为 3-20 的所有字符:^.{3,20}$

  • 由 26 个英文字母组成的字符串:^[A-Za-z]+$

  • 由 26 个大写英文字母组成的字符串:^[A-Z]+$

  • 由 26 个小写英文字母组成的字符串:^[a-z]+$

  • 由数字和 26 个英文字母组成的字符串:^[A-Za-z0-9]+$

  • 由数字、26 个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$

  • 中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$

  • 中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$

  • 可以输入含有 ^%&',;=?$" 等字符:[^%&',;=?$\x22]+

  • 禁止输入含有 ~ 的字符:[^~\x22]+

特殊需求表达式

  • Email 地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

  • 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?

  • InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$

  • 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$

  • 电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$

  • 国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}

  • 身份证号(15 位、18 位数字): 15 位: ^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$ 18 位: ^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$

  • 短身份证号码(数字、字母 x 结尾):^([0-9]){7,18}(x|X)?$^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$

  • 帐号是否合法(字母开头,允许 5-16 字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

  • 密码(以字母开头,长度在 6~18 之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$

  • 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在 8-10 之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$

  • 日期格式:^\d{4}-\d{1,2}-\d{1,2}

  • 一年的 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)$

  • xml 文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$

  • 双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计 2,ASCII字符计 1))

  • 空白行的正则表达式:\n\s*\r (可以用来删除空白行)

  • HTML 标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? /> (网上流传的版本太糟糕,上面这个也仅仅能部分,对于复杂的嵌套标记依旧无能为力)

  • 首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)

  • 校验金额(2位小数): ^[0-9]+(.[0-9]{2})?$

  • 腾讯 QQ 号:[1-9][0-9]{4,} (腾讯 QQ 号从 10000 开始)

  • 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为 6 位数字)

  • IP 地址:\d+\.\d+\.\d+\.\d+ (提取IP地址时有用)

  • IP 地址:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))

  • IPV6 地址: (([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))

  • URL 链接: ((http|ftp|https)://)(([a-zA-Z0-9\._-]+\.[a-zA-Z]{2,6})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,4})*(/[a-zA-Z0-9\&%_\./-~-]*)?

  • EMOJI 表情: ([\uE000-\uF8FF]|\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDDFF])

  • 检查 IE 版本 ^.*MSIE [5-8](?:\\.[0-9]+)?(?!.*Trident\\/[5-9]\\.0).*$

参考资料

这里的一篇图灵文章可以帮助你了解正则表达式的更深层原理:模式、自动机和正则表达式

本文版权归 yangzj1992 所有。来源青春样博客(qcyoung.com),商业转载请联系本人获得授权,非商业转载请注明出处。


本博客采用 Disqus 作为评论解决方案,目前 Disqus 经常被 GFW 封锁,若想参与评论请翻墙访问本站或将 disqus.com 添加至翻墙白名单。你也可以通过导航栏上的社交网站与我联系