正则表达式及常用正则表达式

2,387 阅读4分钟

正则表达式组成:

修饰符:img

  • i:ignoreCase 忽略英文单词大小写匹配
  • m:multiline 可以进行多行匹配
  • g: global 正则表达式默认只会返回第一个匹配结果,使用标志符g则可以返回所有匹配,即全局匹配
  • []:中括号中出现的字符一般都代表本身的含义,并且不存在多位数

常见的字符集有:

  • [xyz]:匹配"x"或"y"或"z"
  • [^xyz]:补集,匹配除"x"或"y"或"z"的其他字符
  • [a-z]:匹配从"a"到"z"的任意字符
  • [^a-n]:补集,匹配除"a"到"n"的其他字符
  • [A-Z]:匹配从"A" 到"Z"的任意字符
  • [0-9]:匹配从"0"到"9"的任意数字
  • 匹配所有字母和数字可以写成:/[a-zA-Z0-9]/或者/[a-z0-9]/i。

Quantifiers(量词)

  • {n}:匹配n次
  • {n,m}:匹配n-m次
  • {n,}:匹配>=nci
  • ?:匹配0||1次
  • *:匹配>=0次,等价于{0,}
  • +:匹配>=1次,等价于{1,}

Metacharacters(元字符)

  • \d:匹配任意数字,等价于[0-9]
  • \D:匹配任意非数字字符;\d的补集
  • \w:匹配任意基于拉丁字母表中的字母和数字,以及下划线;等价于[A-Za-z0-9]
  • \W:匹配任意非基本拉丁字母表中的字母和数字,以及下划线;\w的补集
  • \s:一个空白字符(包含空格、制表符、换页符和其他Unicode空格)
  • \S:匹配一个非空白符;\s的补集
  • \b:匹配一个零宽单词的边界,如一个字母与一个空格之间;例如:/\bno/匹配"atnoon"中的"no",/ly\b/匹配"possibly yesterday."中的"ly"
  • \B:匹配一个零宽非单词边界,如两个字母之间或两个空格之间;例如,/\Bon/ 匹配 "at noon" 中的 "on",/ye\B/ 匹配 "possibly yesterday." 中的 "ye"
  • \t:匹配一个水平制表符(一个tab键:四个空格)
  • \n:匹配一个换行符(newline)
  • \r:匹配一个回车符(carriage return)

Special Characters(特殊字符)

正则中存在一些特殊字符,它们不会按照字母意思进行匹配,而又特殊的意义

  • \:转义字符,可以将普通字符转成特殊字符,也可以将特殊字符转成字面意思(普通含义-特殊含义-普通含义)
  • .:匹配任意单个字符,但是换行符除外:\n,\r,\u2028或\u2029;在字符集中([.]),无特殊含义,即表示"."的字面意思
  • |:替换字符(alternate character),匹配|前或后的表达式。比如需要同时匹配"bear"和"pear",可以使用/(b|p)ear/ 或者/bear|pear/;但是不能用/b|pear/,该表达式只能匹配"b"和"pear"
  • ^:匹配输入的开始。
  • $:匹配输入的结尾。

Groups(分组)

  • (xyz):捕获分组(Capturing Group),匹配并捕获匹配项;例如,/(foo)/匹配且捕获到"foo bar."中的"foo"。被匹配的子字符串可以在结果数组的元素[1],[2]...[n]中找到,或在被定义的RegExp对象的属性中找到
  • (?:xyz):非捕获分组(Non-capturing Group),匹配但不会捕获匹配项,匹配项不能再次被访问到
  • \n:n是一个正整数,表示反向引用(back reference),指向正则表达式第n个括号(从左开始数)中匹配的字符串;例如,/apple(,)\sorange\1/ 匹配 "apple, orange, cherry, peach." 中的 "apple,orange,"

Assertion(断言)

  • x(?=y):仅匹配被y跟随的x;例如,/bruce(?=wayne)/,如果"bruce"后面跟着wayne,则匹配之。/bruce(?=wayne|banner)/ ,如果"bruce"后面跟着"wayne"或者banner,则匹配之。但是,"wayne" 和 "banner" 都不会在匹配结果中出现

  • x(?!y):仅匹配不被y跟随的x;例如,/\d+(?!.)/ 只会匹配不被 "." 跟随的数字。

  • x|y:x或者y中的一个字符

  • [xyz]:x、y或者z中的一个字符

  • [^xy]:除了x、y以外的任意字符

  • [a-z]:指定a-z范围中的任意字符 [0-9a-zA-Z]===\w

  • [^a-z]:上一个取反“非”

  • ():正则中的分组符号

  • (?:):只匹配不捕获

  • (?=):正向预查,=后面必须跟xxx

  • (?!):负向预查,!后面必须不跟xxx

  • 普通元字符:代表本身含义(/jueJin/:"jueJin")

常用的正则表达式:

验证是否为有效数字:
let reg=/^[+-]?(0|([1-9]\d+))(\.\d+)?$/;
验证真实姓名:
//Tips:汉字/^[\u4E00-\u9FA5]$/
let reg=/^[\u4E00-\u9FA5]{2,10}(·[\u4E00-\u9FA5]{2,10}){0,2}$/;
验证身份证号码:
let reg=/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{2})(\d)(\d|X)$/;
或
let reg = /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/
匹配手机号:
//以 1 开头:/^1/
//第2位为3、4、5、7、8中的一个:/[34578]/ 或 /(3|4|5|7|8)/
//剩余3-11位均为数字,并以数字结尾:/\d{9}$/
let reg= /^1[34578]\d{9}$/ ;

验证密码强度

//最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符
let reg=/^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$/;
验证邮箱:
//yourname:任意英文字母(a-z/A-Z)、数字(0-9)、下划线(_)、英文句点(.)、连字符(-),长度大于0:/[a-z\d._-]+/
//domain:任意英文字母(a-z/A-Z)、数字(0-9)、连字符(-),长度大于0:/[a-z\d-]+/
//extension:任意英文字母(a-z/A-Z),长度2-8:/[a-z]{2,8}/
//optional-extension:"."开头,后面跟任意英文字母(a-z/A-Z),长度2-8,可选: /(\.[a-z]{2,8})?/
let reg=/^([a-z\d._-]+)@([a-z\d-]+)\.([a-z]{2,8})(\.[a-z]{2,8})?$/
或者:
let reg=/^\w+((-\w+)|(\.\w+))*@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/;

URL正则:

let reg= /^((https?|ftp|file):\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/

IPv4地址正则:

let ipV4 = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;

十六进制颜色正则:

let cPattern = /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/;

日期正则:

let day = /^(?:(?!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)$/;

匹配qq号:

let qqPattern = /^[1-9][0-9]{4,10}$/;

匹配微信号:

//微信号正则,6至20位,以字母开头,字母,数字,减号,下划线
let wxPattern = /^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$/;

匹配车牌号:

let cPattern = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/;
正则调试工具推荐:Regex101,Regexr,Regexpal