正则表达式

69 阅读1分钟
定义

正则表达式是一种字符串匹配模式

语法
  1. 可见字符:
  • \d:匹配数字0-9
  • \w:匹配可见字符:字母、数字、下划线
  • .:代表除换行符(\n、\r)以外的其它单字符
  1. 非可见字符:
  • \s:匹配空白符
  • \S:匹配非空白符
  • \f:匹配换页符
  • \n:匹配换行符
  • \r:匹配回车符
  • \t:匹配制表符
  • \v:匹配垂直制表符
  • \c+x:匹配控制字符
    • \cL:换页符
    • \cJ:换行符、回车符
    • \cI:制表符
    • \cK:垂直制表符
  1. 特殊预留字符:
  • $:结尾位置
  • ^:代表匹配的开始位置或者取反(^a代表除了a以外的其它字符)
  • g:全局匹配:全局匹配意味着尽可能多次的匹配符合规则的内容,不加全局可能匹配到符合规则的一个就结束了,加了全局以后会匹配到最后
  • i:忽略大小写
  • m:多行匹配
  • ():小括号中的内容为一组内容
  • {n}、{n,m}、{n,}:限定符表达式内容
  1. 限定符:
  • *:表达式的零次或多次

  • +:表达式的一次或多次

  • ?:表达式的零次或一次

  • |:二选一

    ps:限定符都是贪婪匹配,即尽可能多次的匹配。使用?操作符实现最小匹配。

  1. 定位符:
  • \b:单词的前后边界
  • \B:非边界
  • exp1(?=exp2):匹配exp2前面是exp1的场景
  • exp1(?!exp2):匹配exp2前面不是exp1的场景
  • (?<!exp2)exp1:匹配exp2后面不是exp1的场景
  • (?<=exp2)exp1:匹配exp2后面是exp1的场景
注意
  • match数组的第一个返回值是返回符合整个匹配规则的内容,其次如果匹配规则进行了分组匹配,则还会依次返回符合各组匹配规则的内容。
  • 使用全局匹配后,match返回值数组不再包含匹配各分组规则的内容
举例:
    let str2 = 'https://www.zhaowa.com:8080/session/sessionPage.html';
    let pattern1 = /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/
    console.log(str2.match(pattern1))
    //不加全局匹配,打印如下:
    [
        'https://www.zhaowa.com:8080/session/sessionPage.html', //第一个返回值是符合整个匹配规则的内容
        'https',//符合第一个分组规则的内容
        'www.zhaowa.com',//符合第二个分组规则的内容
        ':8080', //符合第三个分组规则的内容
        '/session/sessionPage.html', //符合第四个分组规则的内容
        index: 0, input: 'https://www.zhaowa.com:8080/session/sessionPage.html', groups: undefined]
    let pattern2 = /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/g
    console.log(str2.match(pattern2))  
    //加全局匹配,打印如下:
    ['https://www.zhaowa.com:8080/session/sessionPage.html']
常用的匹配规则

1、手机号

规则:第一位是1、第二位只能是3456789(不一定,按照场景具体分析)、剩余9位无限制

let pattern = /^1[3-9]\d{9}$/   

2、身份证号

规则:15位/18位;18位比15位多了出生年份的前两位数和最后一位的校验码;出生年份是1800-3999

前六位为地区码:[1-9]\d{5}
出生年份的前两位:(18|19|[23]\d{2})
出生年份后两位:(\d{2})
出生月份:((0[1-9])|1[0-2])
出生日期:([0-2][1-9]|10|20|30|31)
三位顺序码:([0-9]{3})
一位校验码:[0-9xX]
18位:/^([1-9]\d{5})(18|19|[23]\d{2})(\d{2})((0[1-9])|1[0-2])([0-2][1-9]|10|20|30|31)([0-9]{3})[0-9xX]$/
15位:/^[1-9]\d{5}(\d{2})((0[1-9])|1[0-2])([0-2][1-9]|10|20|30|31)([0-9]{3})/