Skip to content

正则

正则表达式的魅力

找到字符串中的数字

js
const str = sdfsdf5151sdfsf4541546sf;
[...str].filter(s => !Number.isNaN(parseInt(s))).join("") // 51514541546
str.match(/\d/g).join("") //51514541546
const str = sdfsdf5151sdfsf4541546sf;
[...str].filter(s => !Number.isNaN(parseInt(s))).join("") // 51514541546
str.match(/\d/g).join("") //51514541546

聊天环境净化

js
const reg = /|天美|傻逼/g;
'天美,你马的'.replace(reg, s => '*'.repeat(s.length));//'**,你*的'
const reg = /马|天美|傻逼/g;
'天美,你马的'.replace(reg, s => '*'.repeat(s.length));//'**,你*的'

创建正则表达式

字面量形式

js
/w/.test('wgh');//true

const reg = 'w';
/reg/.test('wgh');//false
eval(`/${reg}/`).test('wgh');//true
/w/.test('wgh');//true

const reg = 'w';
/reg/.test('wgh');//false
eval(`/${reg}/`).test('wgh');//true

使用new关键字创建

js
const reg = new RegExp('w','g');
reg.test('wgh')//true

const a = 'w';
const reg2 = new RegExp(a,'g');
reg2.test('wgh')//true
const reg = new RegExp('w','g');
reg.test('wgh')//true

const a = 'w';
const reg2 = new RegExp(a,'g');
reg2.test('wgh')//true

正则中的或/133|159/ 原子组(/(133|159)/) 原子表[]

js
// 原子组&或
const telReg = /(^133|^159)\d{8}$/g;
telReg.test('15924832872')

// 原子表
const str = 'dfsf51sf15s1f535197856*&&*()%fs6';
str.match(/[53&8*]/g);//['5', '5', '5', '3', '5', '8', '5', '*', '&', '&', '*']
// 原子表取反
str.match(/[^53&8*]/g);//['d', 'f', 's', 'f', '1', 's', 'f', '1', 's', '1', 'f', '1', '9', '7', '6', '(', ')', '%', 'f', 's', '6']
// 原子组&或
const telReg = /(^133|^159)\d{8}$/g;
telReg.test('15924832872')

// 原子表
const str = 'dfsf51sf15s1f535197856*&&*()%fs6';
str.match(/[53&8*]/g);//['5', '5', '5', '3', '5', '8', '5', '*', '&', '&', '*']
// 原子表取反
str.match(/[^53&8*]/g);//['d', 'f', 's', 'f', '1', 's', 'f', '1', 's', '1', 'f', '1', '9', '7', '6', '(', ')', '%', 'f', 's', '6']

转义

js
/\d+.\d+/.test(12.35);//true
new RegExp('\\d+\\.\\d+').test(12.35);//true
new RegExp('\\d+.\\d+').test(12.35);//true
/\d+.\d+/.test(12.35);//true
new RegExp('\\d+\\.\\d+').test(12.35);//true
new RegExp('\\d+.\\d+').test(12.35);//true

边界约束起始^ 结束$

js
const userReg = /^[a-z]{1-6}$/
const userReg = /^[a-z]{1-6}$/

数值与空白元字符

js
const str = 'dfsf51sf15s1f535197856*&&*()%fs6';
//d匹配数字,D表示匹配非数字
str.match(/\d/g);//['5', '1', '1', '5', '1', '5', '3', '5', '1', '6']
str.match(/\D/g);//['d', 'f', 's', 'f', 's', 'f', 's', 'f', '*', '&', '&', '*', '(', ')', '%', 'f', 's']

// s 包括空格,制表符,换行符,一个制表符等于两个空格
const str1 = `fsf f4s5 sfs  f4
sfsf`
str1.match(/\s/g);//[' ', ' ', ' ', ' ', '\n']
// S表示匹配非空白
str1.match(/\S/g);//['f', 's', 'f', 'f', '4', 's', '5', 's', 'f', 's', 'f', '4', 's', 'f', 's', 'f']
const str = 'dfsf51sf15s1f535197856*&&*()%fs6';
//d匹配数字,D表示匹配非数字
str.match(/\d/g);//['5', '1', '1', '5', '1', '5', '3', '5', '1', '6']
str.match(/\D/g);//['d', 'f', 's', 'f', 's', 'f', 's', 'f', '*', '&', '&', '*', '(', ')', '%', 'f', 's']

// s 包括空格,制表符,换行符,一个制表符等于两个空格
const str1 = `fsf f4s5 sfs  f4
sfsf`
str1.match(/\s/g);//[' ', ' ', ' ', ' ', '\n']
// S表示匹配非空白
str1.match(/\S/g);//['f', 's', 'f', 'f', '4', 's', '5', 's', 'f', 's', 'f', '4', 's', 'f', 's', 'f']

字母数字下划线(w) W除了字母数字下划线

js
const str = '12_ds+fjks-hsdkh/*';
str.match(/\w/g);//['1', '2', '_', 'd', 's', 'f', 'j', 'k', 's', 'h', 's', 'd', 'k', 'h']
const str = '12_ds+fjks-hsdkh/*';
str.match(/\w/g);//['1', '2', '_', 'd', 's', 'f', 'j', 'k', 's', 'h', 's', 'd', 'k', 'h']

正则方法

常用正则

校验数字的表达式

  • 电话号码: /^1[3-9]\d{9}$/
  • 数字:^[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-./?%&=]*)?$

  • 身份证号(15位、18位数字),最后一位是校验位,可能为数字或字符X:(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)

  • 帐号是否合法(字母开头,允许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])[a-zA-Z0-9]{8,10}$

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

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

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

  • 校验车牌号:^[粤湘鄂冀豫黑吉辽晋陕青鲁苏皖浙闽赣琼甘贵川港澳桂宁蒙新藏京津沪渝]{1}[A-HJ-NP-Z0-9]{6,7}$

语法参考

  • . - 除换行符以外的所有字符。
  • ^ - 字符串开头。
  • $ - 字符串结尾。
  • \d,\w,\s - 匹配数字、数字字母下划线、空格。
  • \D,\W,\S - 匹配非数字、非数字字母下划线、非空格。
  • [abc] - 匹配 a、b 或 c 中的一个字母。
  • [a-z] - 匹配 a 到 z 中的一个字母。
  • [^abc] - 匹配除了 a、b 或 c 中的其他字母。
  • aa|bb - 匹配 aa 或 bb。
  • ? - 0 次或 1 次匹配。
  • '*' - 匹配 0 次或多次。
  • '*' - 匹配 1 次或多次。
  • {n} - 匹配 n次。
  • {n,} - 匹配 n次以上。
  • {m,n} - 最少 m 次,最多 n 次匹配。
  • (expr) - 捕获 expr 子模式,以 \1 使用它。
  • (?:expr) - 忽略捕获的子模式。
  • (?=expr) - 正向预查模式 expr。
  • (?!expr) - 负向预查模式 expr。