什么是正则表达式
正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为 regex、regexp 或 RE),是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本
正则在线测试工具 https://regexr-cn.com/
正则刷题网 程序胶囊 https://codejiaonang.com/#/course/regex_chapter2/0/0
部分内容转载于Road To Coding
创建一个正则表达式
使用构造函数创建
pattern(模式) 描述了表达式的模式
modifiers(修饰符) 用于指定全局匹配、区分大小写的匹配和多行匹配
let
patt1 =
new
RegExp
(pattern, modifiers);
let
str =
"唱跳rap打篮球"
;
let
patt2 =
new
RegExp
(
"rap"
,
"g"
);
console
.
log
(patt2.
test
(str));
使用字面量形式创建
let str = "唱跳rap打篮球";
let re = /rap/g;
console.log(re.test(str));
注意:当使用构造函数创造正则对象时,需要常规的字符转义规则(在前面加反斜杠 \
)
let re = new RegExp("\\w+");
let re = /\w+/;
基础正则表达式速查表
表达式 | 描述 |
---|
[abc] | 字符集。匹配集合中所含的任一字符 |
[^abc] | 否定字符集。匹配任何不在集合中的字符 |
[a-z] | 字符范围。匹配指定范围内的任意字符 |
. | 匹配除换行符以外的任何单个字符。 |
\ | 转义字符 |
\w | 匹配任何字母数字,包括下划线(等价于[A-Za-z0-9_] ) |
\W | 匹配任何非字母数字(等价于[^a-za-z0-9_] ) |
\d | 数字。匹配任何数字 |
\D | 非数字。匹配任何非数字字符 |
\s | 空白。匹配任何空白字符,包括空格、制表符等 |
\S | 非空白。匹配任何非空白字符 |
2.分组和引用
表达式 | 描述 |
---|
(expression) | 分组。匹配括号里的整个表达式 |
(?:expression) | 非捕获分组。匹配括号里的整个字符串但不获取匹配结果,拿不到分组引用 |
\num | 回溯引用 对前面所匹配分组的引用。比如(\d)\1 可以匹配两个相同的数字,(Code)(Sheep)\1\2 则可以匹配 CodeSheepCodeSheep |
3.锚点/边界
表达式 | 描述 |
---|
^ | 匹配字符串或行开头 |
$ | 匹配字符串或行结尾 |
\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个。 |
5.预查断言
表达式 | 描述 |
---|
(?=) | 正向先行断言:(?=表达式) ,指在某个位置向右看,表示所在位置右侧必须能匹配表达式 |
(?!) | 反向先行断言(?!表达式) 的作用是保证右边不能出现某字符 |
(?<=) | 正向后行断言:(?<=表达式) ,指在某个位置向左看,表示所在位置左侧必须能匹配表达式 |
(?<!) | 反向后行断言:(?<!表达式) ,指在某个位置向左看,表示所在位置左侧不能匹配表达式 |
6.特殊标志
^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$
严格校验,考虑平闰年
^(?:1[0-2]|0?[1-9]):[0-5]\d:[0-5]\d$
12小时制,例如:11:21:31
^(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d$
24小时制,例如:23:21:31
日期+时间
^(\d{1,4}-(?:1[0-2]|0?[1-9])-(?:0?[1-9]|[1-2]\d|30|31)) ((?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d)$
例如:2000-11-11 23:20:21
^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]$
不含新能源
^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z](?:(?:[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳])|(?:(?:\d{5}[A-HJK])|(?:[A-HJK][A-HJ-NP-Z0-9][0-9]{4})))$
包含新能源
^[GCDZTSPKXLY1-9]\d{1,4}$
例如:G1234
^(?:(?:\+|00)86)?1[3-9]\d{9}$
^(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[189]))\d{8}$
^(?:(?:\d{3}-)?\d{8}|^(?:\d{4}-)?\d{7,8})(?:-\d+)?$
手机IMEI码
^\d{15,17}$
一般是15位
^(?:0[1-7]|1[0-356]|2[0-7]|3[0-6]|4[0-7]|5[1-7]|6[1-7]|7[0-5]|8[013-6])\d{4}$
例如:211100
统一社会信用代码
^[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}$
身份证号码(1代)
^[1-9]\d{7}(?:0\d|10|11|12)(?:0[1-9]|[1-2][\d]|30|31)\d{3}$
15位数字
身份证号码(2代)
^[1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\d|30|31)\d{3}[0-9Xx]$
18位数字
^[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}|002[\d]{3}|300[\d]{3}|600[\d]{3}|60[\d]{4})$
A股,例如:600519
银行卡卡号
^[1-9]{1}(?:\d{15}|\d{18})$
一般为19位
^(?: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/
^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}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$
例如:65535
IPv4地址
^(?:(?:\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])$
例如:192.168.31.1
IPv4地址+端口
^(?:(?:\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])(?::(?:[0-9]|[1-9][0-9]{1,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?$
例如:192.168.31.1:8080
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]))$
例如:CDCD:910A:2222:5498:8475:1111:3900:2020
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]))\](?::(?:[0-9]|[1-9][0-9]{1,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?$
例如:[CDCD:910A:2222:5498:8475:1111:3900:2020]:9800
^(?:254|252|248|240|224|192|128)\.0\.0\.0|255\.(?:254|252|248|240|224|192|128|0)\.0\.0|255\.255\.(?:254|252|248|240|224|192|128|0)\.0|255\.255\.255\.(?:255|254|252|248|240|224|192|128|0)$
例如:255.255.255.0
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|jpg|jpeg|webp|svg|psd|bmp|tif)+
可按需增删扩展名集合
\.(swf|avi|flv|mpg|rm|mov|wav|asf|3gp|mkv|rmvb|mp4)+
可按需增删扩展名集合
(?:https?:\/\/)?[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(?:\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+.+\.(gif|png|jpg|jpeg|webp|svg|psd|bmp|tif)
可按需增删扩展名集合
(?:https?:\/\/)?[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(?:\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+.+\.(swf|avi|flv|mpg|rm|mov|wav|asf|3gp|mkv|rmvb|mp4)
可按需增删扩展名集合
thunderx?:\/\/[a-zA-Z\d]+=
ed2k链接
ed2k:\/\/\|file\|.+\|\/
magnet:\?xt=urn:btih:[0-9a-fA-F]{40,}.*
BASE64格式
^\s*data:(?:[a-z]+\/[a-z0-9-+.]+(?:;[a-z-]+=[a-z0-9-]+)?)?(?:;base64)?,([a-z0-9!$&',()*+;=\-._~:@/?%\s]*?)\s*$
例如:data:image/jpeg;base64,xxxx==
^[a-f\d]{4}(?:[a-f\d]{4}-){4}[a-f\d]{12}$
例如:94f9d45a-71b0-4b3c-b69d-20c4bc9c8fdd
^[A-Fa-f0-9]+$
例如:FFFFFF
16进制颜色
^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$
例如:#FFFFFF
SQL语句
^(?:select|drop|delete|create|update|insert).*$
Java包名
^(?:[a-zA-Z_]\w*)+(?:[.][a-zA-Z_]\w*)+$
例如:com.r2coding.controller
文件扩展名
\.(?:doc|pdf|txt)
可按需增删扩展名集合
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/
ssh_晨曦时梦见兮