Skip to content

创建正则表达式

  1. 使用正则表达式的构造函数
js
let regex = new RegExp("a");
let regex = new RegExp("^[a-zA-Z]", "g");
let regex = new RegExp(/^[a-zA-Z]/, "gi");

<!--more-->

  1. 创建字面量(由两个反斜杠'//'包裹需要匹配的内容)
let regex = /ab/;
let regex = /^[a-zA-Z]/;

这两种方式都可以来创建一个正则表达式,但是相对来说第二种方式更加常用一些。

正则表达式的参数,写在//后面,可混合使用

  • g 全局匹配,找到所有匹配,而不是在第一个匹配后停止
  • i 匹配全部大小写
  • m 多行,将开始和结束字符(^和$)视为在多行上工作(也就是,分别匹配每一行的开始和结束,有\n 或\r 分割),而不只是只匹配整个输入字符串的最开始和最末尾处。
  • s 和 m 相反,单行匹配
let regex = /^[a-zA-Z]/gim;

正则中常用方法以及字符串中与正则相关的方法

  • test() 方法检索字符串中的值是都匹配给出的正则规则,返回布尔值 true 或 false

    检索"ab"是否匹配前面的正则表达式/../,正确返回 true,不匹配则返回 false

    /../.test("ab")
  • exec()方法检索字符串中的指定值,如果找到匹配的文本,则返回一个结果的数组,反之返回 null

    检索正则表达式/abc/是否有在字符串中 defaabc 有匹配到,返回匹配到内容,索引值,以及检索的字符串

    /abc/.exec("defaabc") // ["abc", index: 4, input: "defaabc", groups: undefined]

    检索/qqq/是否在 abcdefaabc 中匹配到,返回 null

    /qqq/.exec('abcdefaabc') // null
  • compile()方法用于改变正则匹配内容

    将/abc/的匹配内容改为后面的字符出的内容

    /abc/.compile('def') // /def/
  • split()将字符串分割成字符串数组

    将字符串 abcd 以/b/中的 b 分割成字符串数组

    "abcd".split(/b/); // ["a", "cd"]
  • replace()方法用于在字符串中用一些字符替换另一些字符或者替换一个与正则表达式匹配的字符串

    用正则内容/\d\d\d/去匹配字符串 12345abcde,将匹配的内容替换成*,并返回替换完成的字符串

    '12345abcde'.replace(/\d\d\d/g, '*'); // "*45abcde"

    去掉字符串的引号,全局搜索',替换成''空

    '12345abcde'.replace(/'/g, ''); // "12345abcde"

    去掉字符串中所有的空格,tab,换页符,换行符

    ' 12 345ab cd    e '.replace(/\s/g,''); // "12345abcde"
  • search()用于检索字符串中指定的字符串或与正则表达式相匹配的字符串,返回匹配的字符串的起始位置的索引,反之返回-1

    'abcdedsdfsdfsd'.search(/d/); // 3

    即使是全局匹配,也只会返回匹配到第一个的位置

    'abcdededsfsdf'.search(/d/g); // 3

    如果没有匹配到,则返回-1

    'abcdefdsfdf'.search(/o/g); // -1
  • match()方法可在字符串之内检索指定的值,或找到一个或多个正则表达式的匹配检索指定的值,并返回, b+值多个

    "aaabbbbccdddaabb".match(/b+/g); // ["bbbb", "bb"]

正则规则

<img src="https://user-gold-cdn.xitu.io/2018/5/29/163aad82a90e33a8?imageView2/0/w/1280/h/960/format/webp/ignore-error/1"></img>

  • .任意字符

    关于这个(.)可能是匹配最多内容的字符了,他的匹配规则是除去换行(\n)和回车(/r)之外的任意字符。

    测试字母:

    /.../.test('abc'); // true

    测试数字:

    /.../.test(123); // true

    特殊符号:

    /........../.test("!@$%^&*()_+"); // true
  • \d 匹配数字 0-9

    测试字母:

    /\d/.test("a");  // false

    测试数字:

    /\d/.test(5); // true

    特殊符号:

    /\d\d\d\d\d\d\d\d\d\d\d\d\d/.test("!@#$%^&*()_+")    // false
  • \D 匹配除数字 0~9 的所有字符(非\d)

    测试字母:

    /\D/.test("a");          // true

    测试数字:

    /\D/.test(5)             // false

    特殊符号:

    /\D\D/.test("!@")        // true
  • \w 匹配数字 0~9,字母 a~z,A~Z,下划线

    测试字母:

    /\w/.test("a");          // true

    测试数字:

    /\w/.test(5)             // true

    特殊符号:

    /\w\w/.test("!@")        // false
  • \W 匹配非\w 的特殊符号

    测试字母:

    /\W/.test("a");           // false

    测试数字:

    /\W/.test(5)              // false

    特殊符号:

    /\W\W/.test("!@")         // true
  • \s 匹配空格 tab 换页符、换行符

    测试字母:

    /\s/.test("a"); // false

    测试数字:

    /\s/.test(5); // false

    特殊符号:

    /\s/.test("@"); // false

    空格 tab:

    /\s\s/.test("    "); // true
  • \S 匹配非\s 的内容

    测试字母:

    /\S/.test("a"); // true

    测试数字:

    /\S/.test(5); // true

    特殊符号:

    /\S/.test("@"); // true

    空格 tab

    /\S/.test("         "); // false

范围符号匹配规则

<img src="https://user-gold-cdn.xitu.io/2018/5/30/163aee18e6b545ee?imageView2/0/w/1280/h/960/format/webp/ignore-error/1" />

分组匹配规则

<img src="https://user-gold-cdn.xitu.io/2018/5/30/163aee220257fe90?imageView2/0/w/1280/h/960/format/webp/ignore-error/1"/>

重复匹配规则

<img src="https://user-gold-cdn.xitu.io/2018/5/30/163aee281db6f27b?imageView2/0/w/1280/h/960/format/webp/ignore-error/1" />

比较常用的正则匹配

手机号码

  • 移动号段: 134 135 136 137 138 139 147 148 150 151 152 157 158 159 172 178 182 183 184 187 188 198

  • 联通号段: 130 131 132 145 146 155 156 166 171 175 176 185 186

  • 电信号段: 133 149 153 173 174 177 180 181 189 199

  • 虚拟运营商: 170

匹配 13*的手机号:

/^13(\d){9}$/.test(13131121111)

匹配 14*的手机号:

/^(1)4[5-9]{1}(\d){8}$/.test(14531121989)

匹配 15*的手机号:

/^(1)5[^4]{9}$/.test(15531121989)

匹配 16*的手机号:

/^(1)66(\d){8}$/.test(16631121989)

匹配 17*的手机号:

/^(1)7[0-8]{1}(\d){8}$/.test(17199121989)

匹配 18*的手机号:

/^(1)8(\d){9}$/.test(18131121989)

匹配 19*的手机号:

/^(1)9[8-9](\d){8}$/.test(19831121989)

匹配所有手机号:

/^(1)(3(\d){9}$)|(4[5-9]{1}(\d){8}$)|(5[^4]{9})|(66(\d){8})|(7[0-8]{1}(\d){8})|(8(\d){9}$)|(9[8-9](\d){8}$)/.test(19931121989)

邮箱

  • 126 规则:6~18 个字符,可使用字母、数字、下划线,需以字母开头
  • 163 规则:6~18 个字符,可使用字母、数字、下划线,需以字母开头 允许手机号
  • qq 邮箱:数字 5-10 个数字
  • 新浪邮箱规则:4-16 个字符,可使用英文小写,数字,下划线,下划线不可在首位
  • 搜狐邮箱规则:4-16 位,英文、数字、下划线,小写字母开头

匹配 126 邮箱:

/((^([a-z])|^([A-Z])){1}(\w){5,17})@126.com$/.test("AA3333333333333333@126.com")

匹配 163 邮箱:

/((^([a-z])|^([A-Z])){1}(\w){5,17}$)|(^(1)(3(\d){9}$)|(4[5-9]{1}(\d){8}$)|(5[^4]{9})|(66(\d){8})|(7[0-8]{1}(\d){8})|(8(\d){9}$)|(9[8-9](\d){8}$))@163.com$/.test("15132221989@163.com")

匹配 qq 邮箱:

/([1-9]){5,11}@qq.com$/.test("115511@qq.com")

匹配新浪邮箱:

/(^([a-z])|^(\d)){1}(\w){3,15}@sina.(cn)|(com)$/.test("223dddddddfasddw@sina.com")

匹配搜孤邮箱:

/(^[a-z]){1}(\w){3,15}@sohu.com$/.test("dddddddfw@sohu.com")

中文

/^[\u4e00-\u9fa5]$/g.test("我")

国内邮政编码

/^[0-9]{6}$/.test(100000)

出处:https://juejin.im/post/5b0cf331f265da0905017b48