正则表达式,又称规则表达式。在代码中常简写为regex、regexp或RE,计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
给定的字符串是否符合正则表达式的过滤逻辑(“匹配”);
通过正则表达式,从文本字符串中获取我们想要的特定部分(“过滤”)。
正则表达式匹配规则
| 语法 | 说明 | 表达式实例 | 完整匹配的字符串 |
|---|---|---|---|
| 字符 | |||
| 一般字符 | 匹配自身 | abc | abc |
| . | 匹配任意除换行符”\n”外的字符。在DOTALL模式中也能匹配换行符。 | a.c | abc |
| \ | 转义字符,使后一个字符改变原来的意思,如果字符串中有字符需要匹配,可以使用\或者字符集[*]. | a\.c a\\c | a\c |
| […] | 字符集(字符类)。对应的位置可以是字符集中任意字符。字符集中的字符可以逐个列出,也可以给出范围,如[abc]或[a-c].第一个字符如果是^则表示取反,如[^abc]表示不是abc的其他字符。所有的特殊字符在字符集中都失去其原有的特俗含义。在字符集中如果要使用]、-或^,可以在前面加上反斜杠,或把]、-放在第一个字符,把^放在非第一个字符。 | a[bcd]c | abe ace ade |
| 预定义字符集 | |||
| \d | 数字:[0-9] | a\dc | a1c |
| \D | 非数字:[^\d] | a\Dc | abc |
| \s | 空白字符:[<空格>\t\r\n\f\v] | a\sc | a c |
| \w | 单词字符:[A-Z a-Z 0-9_] | a\wc | abc |
| \W | 非单词字符:[^\W] | a\Wc | a c |
| 数量词 | |||
| * | 匹配前一个字符0或无限次 | abc* | ab abcc |
| + | 匹配前一个字符1次或无限次 | abc+ | abc abcc |
| ? | 匹配前一个字符0次或1次 | abc? | ab abc abbc |
| {m} | 匹配前一个字符m次 | ab{2}c | abbc |
| {m,n} | 匹配前一个字符m至n次。m和n可以省略:若省略m,则匹配0至n次;若省略n则匹配m至无限次。 | ab{1,2}c | abc abbc |
| 边界匹配 | |||
| ^ | 匹配字符串开头。在多行模式中匹配每一行的开头 | ^abc | abc |
| $ | 匹配字符串末尾。在多行模式中匹配每一行的末尾 | abc$ | abc |
| \A | 仅匹配字符串开头。 | \Aabc | abc |
| \Z | 仅匹配字符串末尾。 | abc\Z | abc |
| \b | 匹配字\w和\W之间。 | a\b!bc | a!bc |
| \B | [^\b] | a\Bbc | abc |
| 逻辑分组 | |||
| | | |代表左右表达式任意匹配一个。它总是先尝试匹配左边的表达式,一旦成功匹配则跳过匹配右边的表达式。如果|没有被包括在()中,则它的范围是整个正则表达式。 | abc|def | abc def |
| (…) | 被括起来的表达式将作为分组,从表达式左边开始每遇到一个分组的左括号’(‘,编号+1.另外分组表达式作为一个整体,可以后接数量词。表达式中的|仅在该组中有效。 | (abc){2} a{123|456)c | abcabc a456c |
| (?P<name>…) | 分组除了原来的编号另外再指定一个额外的别名。 | (?P<id>abc){2} | abcabc |
| \<number> | 引用编号为<number>的分组匹配到的字符串。 | (\d)abc\1 | 1abc1 5abc5 |
| 特殊构造 | |||
| (?…) | (…)的部分组版本,用于使用”|”或后接数量词。 | (?:abc){2} | abcabc |
| (?iLmsux) | iLmsux的每个字符代表一个匹配模式,只能用在正则表达式的开头,可选多个。匹配模式将在下文介绍。 | (?i)abc | Abc |
| (?#…) | #后的内容将作为注释被忽略。 | abc(?#comment)123 | abc123 |
| (?=…) | 之后的字符串内容需要匹配表达式。才能成功匹配。不消耗字符串内容。 | a(?=\d)后面是数字的a | |
| (?!…) | 之后的字符串内容需要不匹配表达式。才能成功匹配。不消耗字符串内容。 | a(?!\d) 后面不是数字的a | |
| (?<=…) | 之前的字符串内容需要匹配表达式。才能成功匹配。不消耗字符串内容。 | a(?<=\d)a 前面是数字的a | |
| (?<!…) | 之前的字符串内容需要不匹配表达式。才能成功匹配。不消耗字符串内容。 | a(?<!\d)a 前面不是数字的a |
| 表达式 | 描述 |
|---|---|
| [abc] | 字符集。匹配集合中所含的任一字符。 |
| [^abc] | 否定字符集。匹配任何不在集合中的字符。 |
| [a-z] | 字符范围。匹配指定范围内的任意字符。 |
| . | 匹配除换行符以外的任何单个字符。 |
| \ | 转义字符。 |
| \w | 匹配任何字母数字,包括下划线(等价于[A-Za-z0-9_])。 |
| \W | 匹配任何非字母数字(等价于[^A-Za-z0-9_])。 |
| \d | 数字。匹配任何数字。 |
| \D | 非数字。匹配任何非数字字符。 |
| \s | 空白。匹配任何空白字符,包括空格、制表符等。 |
| \S | 非空白。匹配任何非空白字符。 |
| (expression) | 分组。匹配括号里的整个表达式。 |
| (?:expression) | 非捕获分组。匹配括号里的整个字符串但不获取匹配结果,拿不到分组引用。 |
| \num | 对前面所匹配分组的引用。比如(\d)\1可以匹配两个相同的数字,(Code)(Sheep)\1\2则可以匹配CodeSheepCodeSheep。 |
| ^ | 匹配字符串或行开头。 |
| $ | 匹配字符串或行结尾。 |
| \b | 匹配单词边界。比如Sheep\b可以匹配CodeSheep末尾的Sheep,不能匹配CodeSheepCode中的Sheep |
| \B | 匹配非单词边界。比如Code\B可以匹配HelloCodeSheep中的Code,不能匹配HelloCode中的Code。 |
| ? | 匹配前面的表达式0个或1个。即表示可选项。 |
| + | 匹配前面的表达式至少1个。 |
| * | 匹配前面的表达式0个或多个。 |
| | | 或运算符。并集,可以匹配符号前后的表达式。 |
| {m} | 匹配前面的表达式m个。 |
| {m,} | 匹配前面的表达式最少m个。 |
| {m,n} | 匹配前面的表达式最少m个,最多n个。 |
| (?=) | 正向预查。比如Code(?=Sheep)能匹配CodeSheep中的Code,但不能匹配CodePig中的Code。 |
| (?!) | 正向否定预查。比如`Code(?!Sheep)不能匹配CodeSheep中的Code,但能匹配CodePig中的Code。 |
| (?<=) | 反向预查。比如(?<=Code)Sheep能匹配CodeSheep中的Sheep,但不能匹配`ReadSheep中的Sheep。 |
| (?<!) | 反向否定预查。比如(?<!Code)Sheep不能匹配CodeSheep中的Sheep,但能匹配`ReadSheep中的Sheep。 |
| /…/i | 忽略大小写。 |
| /…/g | 全局匹配。 |
| /…/m | 多行修饰符。用于多行匹配。 |
- 数字校验
| 描述 | 正则表达式 | 备注 |
|---|---|---|
| 数字 | ^[0-9]*$ |
|
| n位数字 | ^\d{n}$ |
|
| 至少n位数字 | ^\d{n,}$ |
|
| m~n位数字 | ^\d{m,n}$ |
|
| 整数 | ^(-?[1-9]\d*)$ |
非0开头,包括正整数和负整数 |
| 正整数 | ^[1-9]\d*$ |
|
| 负整数 | ^-[1-9]\d*$ |
|
| 非负整数 | `^(([1-9]\d*) | 0)$` |
| 非正整数 | `^((-[1-9]\d*) | 0)$` |
| 浮点数 | `^-?(?:[1-9]\d.\d | 0.\d[1-9]\d |
| 正浮点数 | `^(?:[1-9]\d.\d | 0.\d[1-9]\d)$` |
| 负浮点数 | `^-(?:[1-9]\d.\d | 0.\d[1-9]\d)$` |
| 非正浮点数 | `^(?:-(?:[1-9]\d*.\d+ | 0.\d[1-9]\d) |
| 非负浮点数 | `^(?:[1-9]\d*.\d+ | 0.\d+ |
| 仅一位小数 | `^-?(?:0 | [1-9][0-9]*).[0-9]{1}$` |
| 最少一位小数 | `^-?(?:0 | [1-9][0-9]*).[0-9]{1,}$` |
| 最多两位小数 | `^-?(?:0 | [1-9][0-9]*).[0-9]{1,2}$` |
| 连续重复的数字 | ^(\d)\1+$ |
例如:111,222 |
- 字符校验
| 描述 | 正则表达式 | 备注 |
|---|---|---|
| 中文 | ^[\u4E00-\u9FA5]+$ |
|
| 全角字符 | ^[\uFF00-\uFFFF]+$ |
|
| 半角字符 | ^[\u0000-\u00FF]+$ |
|
| 英文字符串(大写) | ^[A-Z]+$ |
|
| 英文字符串(小写) | ^[a-z]+$ |
|
| 英文字符串(不区分大小写) | ^[A-Za-z]+$ |
|
| 中文和数字 | `^(?:[\u4E00-\u9FA5]{0,} | \d)+$` |
| 英文和数字 | ^[A-Za-z0-9]+$ |
|
| 数字、英文字母或者下划线组成的字符串 | ^\w+$ |
|
| 中文、英文、数字包括下划线 | ^[\u4E00-\u9FA5\w]+$ |
|
| 不含字母的字符串 | ^[^A-Za-z]*$ |
|
| 连续重复的字符串 | ^(.)\1+$ |
例如:aa,bb |
| 长度为n的字符串 | ^.{n}$ |
|
| ASCII | ^[ -~]$ |
- 日期和时间校验
| 描述 | 正则表达式 | 备注 |
|---|---|---|
| 日期 | `^\d{1,4}-(?:1[0-2] | 0?[1-9])-(?:0?[1-9] |
| 日期 | `^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9] | 1[0-2])-(?:0[1-9] |
| 时间 | `^(?:1[0-2] | 0?[1-9]):[0-5]\d:[0-5]\d$` |
| 时间 | `^(?:[01]\d | 2[0-3]):[0-5]\d:[0-5]\d$` |
| 日期+时间 | `^(\d{1,4}-(?:1[0-2] | 0?[1-9])-(?:0?[1-9] |
- 日常生活相关
| 描述 | 正则表达式 | 备注 |
|---|---|---|
| 中文名 | ^[\u4E00-\u9FA5·]{2,16}$ |
|
| 英文名 | ^[a-zA-Z][a-zA-Z\s]{0,20}[a-zA-Z]$ |
|
| 车牌号 | ^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]$ |
不含新能源 |
| 车牌号 | `^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领]A-HJ-NP-Z | (?:(?:\d{5}[A-HJK]) |
| 火车车次 | ^[GCDZTSPKXLY1-9]\d{1,4}$ |
例如:G1234 |
| 手机号 | `^(?:(?:+ | 00)86)?1[3-9]\d{9}$` |
| 手机号 | `^(?:(?:+ | 00)86)?1(?:(?:3[\d]) |
| 固话号码 | `^(?:(?:\d{3}-)?\d{8} | ^(?:\d{4}-)?\d{7,8})(?:-\d+)?$` |
| 手机IMEI码 | ^\d{15,17}$ |
一般是15位 |
| 邮编 | `^(?:0[1-7] | 1[0-356] |
| 统一社会信用代码 | ^[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}$ |
|
| 身份证号码(1代) | `^[1-9]\d{7}(?:0\d | 10 |
| 身份证号码(2代) | `^[1-9]\d{5}(?:18 | 19 |
| QQ号 | ^[1-9][0-9]{4,}$ |
一般是5到10位 |
| 微信号 | ^[a-zA-Z][-_a-zA-Z0-9]{5,19}$ |
一般6~20位,字母开头,可包含字母、数字、-、_,不含特殊字符 |
| 股票代码 | `^(s[hz] | S[HZ])(000[\d]{3} |
| 银行卡卡号 | `^[1-9]{1}(?:\d{15} | \d{18})$` |
- 互联网相关
| 描述 | 正则表达式 | 备注 |
|---|---|---|
| 域名 | ^[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(?:\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$ |
例如:r2coding.com |
| 网址 | ^(?:https?:\/\/)?[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(?:\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$ |
例如:https://www.r2coding.com/ |
| 带端口号的网址(或IP) | ^(?:https?:\/\/)?[\w-]+(?:\.[\w-]+)+:\d{1,5}\/?$ |
例如:http://127.0.0.1:8888/ |
| URL | ^https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()!@:%_\+.~#?&\/\/=]*)$ |
例如:https://www.r2coding.com/#/README?id=1 |
| 邮箱email | ^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(?:\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$ |
支持中文,例如:codesheep@cs.com |
| 用户名 | ^[a-zA-Z0-9_-]{4,20}$ |
4到20位 |
| 弱密码 | ^[\w]{6,16}$ |
6~16位,包含大小写字母和数字的组合 |
| 强密码 | ^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@\.#$%^&*? ]).*$ |
至少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符 |
| 端口号 | `^(?:[0-9] | [1-9][0-9]{1,3} |
| IPv4地址 | `^(?:(?:\d | [1-9]\d |
| IPv4地址+端口 | `^(?:(?:\d | [1-9]\d |
| IPv6地址 | `^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4} | ([0-9a-fA-F]{1,4}:){1,7}: |
| IPv6地址+端口 | `^[(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4} | ([0-9a-fA-F]{1,4}:){1,7}: |
| 子网掩码 | `^(?:254 | 252 |
| MAC地址 | `^(?:(?:[a-f0-9A-F]{2}:){5} | (?:[a-f0-9A-F]{2}-){5})[a-f0-9A-F]{2}$` |
| Version版本号 | ^\d+(?:\.\d+){2}$ |
例如:12.1.1 |
| 图片后缀 | `.(gif | png |
| 视频后缀 | `.(swf | avi |
| 图片链接 | `(?:https?://)?[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(?:.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+.+.(gif | png |
| 视频链接 | `(?:https?://)?[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(?:.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+.+.(swf | avi |
| 迅雷链接 | thunderx?:\/\/[a-zA-Z\d]+= |
|
| ed2k链接 | ed2k:\/\/|file|.+|\/ |
|
| 磁力链接 | magnet:\?xt=urn:btih:[0-9a-fA-F]{40,}.* |
- 其他
| 描述 | 正则表达式 | 备注 |
|---|---|---|
| MD5格式 | `^(?:[a-f\d]{32} | [A-F\d]{32})$` |
| BASE64格式 | ^\s*data:(?:[a-z]+\/[a-z0-9-+.]+(?:;[a-z-]+=[a-z0-9-]+)?)?(?:;base64)?,([a-z0-9!$&',()*+;=\-._~:@/?%\s]*?)\s*$ |
例如:data:image/jpeg;base64,xxxx== |
| UUID | ^[a-f\d]{4}(?:[a-f\d]{4}-){4}[a-f\d]{12}$ |
例如:94f9d45a-71b0-4b3c-b69d-20c4bc9c8fdd |
| 16进制 | ^[A-Fa-f0-9]+$ |
例如:FFFFFF |
| 16进制颜色 | `^#?([0-9a-fA-F]{3} | [0-9a-fA-F]{6})$` |
| SQL语句 | `^(?:select | drop |
| Java包名 | ^(?:[a-zA-Z_]\w*)+(?:[.][a-zA-Z_]\w*)+$ |
例如:com.r2coding.controller |
| 文件扩展名 | `.(?:doc | |
| Windows文件路径 | ^[a-zA-Z]:(?:\\[\w\u4E00-\u9FA5\s]+)+[.\w\u4E00-\u9FA5\s]+$ |
例如:C:\Users\Administrator\Desktop\a.txt |
| Windows文件夹路径 | ^[a-zA-Z]:(?:\\[\w\u4E00-\u9FA5\s]+)+$ |
例如:C:\Users\Administrator\Desktop |
| Linux文件路径 | ^\/(?:[^/]+\/)*[^/]+$ |
例如:/root/library/a.txt |
| Linux文件夹路径 | ^\/(?:[^/]+\/)*$ |
例如:/root/library/ |
