• JavaScript正则表达式基础


    创建正则表达式,一般有两种写法

    1. //定义式创建正则,写法:两个斜杠中间放正则式子
    2. const reg = /abc/;
    3. //new关键字创建正则,写法:两个斜杠中间放正则式子或直接去掉斜杠放字符串式表达式
    4. const regExp = new RegExp('abc')

    .test('需要验证的字符'),正则的方法用来验证正则的匹配结果true or false

    修饰符

    写法:/正则/ 修饰符

    示例:/abc/i (匹配字符串abc并且不区分大小)

    i:执行对大小写不敏感的匹配(不区分字母的大小写)

    g:执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)

    m:执行多行匹配

    其他:修饰符还有其他的一般用的少,常用的基本就上面三个

    正则分类

    预定义类

    1. // .的意思是除了换行和回车之外的任意字符
    2. //如果检测的字符串里面包含 除了换行和回车之外的任意字符 那就返回true,否则返回false.
    3. console.log(/./.test("\r"))// false \r代表return,return表示回到一行的开头
    4. console.log(/./.test("\n"))//false \n代表newline,新的一行
    5. console.log(/./.test("\r\n"))//false \r\n表示换行并将光标定位到一行的开头
    6. console.log(/./.test(""))//false
    7. console.log(/./.test("12klk"))//true
    8. // \d表示数字,d是英文digit的意思
    9. console.log(/\d/.test("kjdksj"));//false
    10. console.log(/\d/.test("kj7ksj"));//true
    11. // \D表示非数字的意思
    12. console.log(/\D/.test("kjdksj"));//true
    13. console.log(/\D/.test("k2"));//true
    14. console.log(/\D/.test("12345"));//false
    15. // \s表示表示不可见字符
    16. console.log(/\s/.test("\t"));//true \t 表示制表符
    17. console.log(/\s/.test("\f"));//true \t 表示换页符
    18. console.log(/\s/.test("\v"));//true \v 表示垂直制表符
    19. console.log(/\s/.test("\n"));//true \n 换行符
    20. console.log(/\s/.test("\r"));//true \r 回车符
    21. console.log(/\s/.test(" "));//true
    22. console.log(/\s/.test("jhsjhsdh"));//false
    23. // \S表示表示可见字符 跟小s相反
    24. console.log(/\S/.test("\t"));//false
    25. console.log(/\S/.test("jinitaimei"));//true
    26. // \w表示单词字符(所有单词和数字以及下划线_)
    27. console.log(/\w/.test("rerer3434"));//true
    28. console.log(/\w/.test("3434"));//true
    29. console.log(/\w/.test("wewewe"));//true
    30. console.log(/\w/.test("___ "));//true
    31. console.log(/\w/.test("@##$$"));//false
    32. // \W表示非单词字符(所有非单词和数字以及下划线_)
    33. console.log(/\W/.test("rerer3434"));//false
    34. console.log(/\W/.test("3434"));//false
    35. console.log(/\W/.test("wewewe"));//false
    36. console.log(/\W/.test("___wewe"));//false
    37. console.log(/\W/.test("@##$$"));//true

    自定义类

    1. console.log(/鸡/.test("鸡霓太美"));//true
    2. console.log(/鸡/.test("基尼太美"));//false

    或跟优先级

    1. // a|b 表示或,此处表示字母a或者b
    2. console.log(/a|b/.test("asasas"));//true
    3. console.log(/a|b/.test("sbbbbbbbb"));//true
    4. console.log(/a|b/.test("dfdfdfdf"));//false
    5. // q(a|b)q 表示优先计算(a|b),跟普通的数学运算一样
    6. console.log(/q(a|b)q/.test("qaq"));//true
    7. console.log(/q(a|b)q/.test("qbq"));//true
    8. console.log(/q(a|b)q/.test("qaa"));//false
    9. console.log(/q(a|b)q/.test("qqqq"));//false

    简单类

    1. // [abc]表示abc中的任意一个
    2. console.log(/[abc]/.test("qaq"));//true
    3. console.log(/[abc]/.test("bbbc"));//true
    4. console.log(/[abc]/.test("cc1213"));//true
    5. console.log(/[abc]/.test("dddfff"));//false
    6. console.log(/a[abc]a/.test("aaa"));//true
    7. console.log(/a[abc]a/.test("aca"));//true
    8. console.log(/a[abc]a/.test("aa"));//false

     范围类

    1. // [a-z]表示范围类a到字母z,[0-9]表示范围类0到数字9
    2. console.log(/[a-z]/.test("qaq"));//true
    3. console.log(/[a-z]/.test("cc"));//true
    4. console.log(/[a-z]/.test("2323"));//false
    5. console.log(/[0-9]/.test("2"));//true
    6. console.log(/[0-9]/.test("20"));//true
    7. console.log(/[0-9]/.test("wewe"));//false

    负向类

    1. // [^aa]表示除aa字符以外的任意字符
    2. console.log(/[^aa]/.test("aa"));//false
    3. console.log(/[^aa]/.test("vvvvvvvvaa"));//true
    4. console.log(/[^aa]/.test("wewewe"));//true
    5. console.log(/[^aa]/.test("12wewea"));//true

    组合类

    1. // [^a-d][^1-4],[^a-d]表示字母a-d之外,[^1-4]表示数字1-4之外,两个中括号表示至少要两个字符
    2. console.log(/[^a-d][^1-4]/.test("aa"));//false
    3. console.log(/[^a-d][^1-4]/.test("a5"));//false
    4. console.log(/[^a-d][^1-4]/.test("d"));//false 数量及条件都不满足
    5. console.log(/[^a-d][^1-4]/.test("f"));//false 数量不满足
    6. console.log(/[^a-d][^1-4]/.test("f5"));//true
    7. console.log(/[^a-d]|[^1-4]/.test("f"));//true 中间加了一个条件|(或)
    8. console.log(/[^a-d](11|22)/.test("a11"));//false
    9. console.log(/[^a-d](11|22)/.test("e12"));//false
    10. console.log(/[^a-d](11|22)/.test("e11"));//true

    边界与严格匹配 

    1. // /^a/ ^a表示以a开头的字符, /c$/c$表示以c结尾的字符
    2. console.log(/^a/.test("abc"));//true
    3. console.log(/^a/.test("Aabc"));//false
    4. console.log(/c$/.test("abc"));//true
    5. console.log(/c$/.test("abccc"));//true
    6. // /^$/表示严格匹配^$两个符号中间的正则,且只能出现一次
    7. console.log(/^ac$/.test("ac"));//true
    8. // 当^跟$同时出现的时候即为严格匹配两个符号中间的正则而不仅仅是开头跟结尾了
    9. console.log(/^ac$/.test("abc"));//false 此处正则为严格匹配自定义类ac字符,而非以a开头c结尾
    10. console.log(/^ac$/.test("acac"));//false 严格模式只能出现一次,多次则为false
    11. console.log(/^ac$/.test("acs"));//false

     量词

    1. // 量词:
    2. // 1.*表示出现零次或者多次 result>=0
    3. // 2.+表示出现一次或者多次 result>=1
    4. // 3.?表示出现零次或一次 result=(0||1)
    5. // 4.{n}表示只能出现n次,n是任意大于等于0的数字
    6. // 5.{n,}表示大于等于n的次数,n是任意大于等于0的数字
    7. // 6.{n,m}表示大于n小于m的次数,n跟m是任意大于等于0的数字
    8. // 此处的多次表示量词前面的正则字符匹配结果
    9. console.log(/^abc*$/.test("abc"));//true ab符合,c出现了一次,符合严格模式,所以为true
    10. console.log(/^abc*$/.test("ab"));//true ab符合,c出现了零次,符合严格模式,所以为true
    11. console.log(/^abc*$/.test("ac"));//false a开头符合了,c出现了一次符合了,但是没有b,所以false
    12. console.log(/abc*/.test("ac"));//false a有了,c出现了一次符合了,但是没有b,所以false
    13. console.log(/^abc*$/.test("abcccc"));//true ab都有了且c出现了多次,符合严格模式,所以false
    14. console.log(/^abc*$/.test("abbcccc"));//false ab都有了但没有abc连续,所以false
    15. console.log(/^abc*$/.test("abcabc"));//false ab符合,c也出现了一次,但不符合严格模式,所以为false
    16. console.log(/^abc+$/.test("abc"));//true ab符合,c出现了一次,符合严格模式,所以为true
    17. console.log(/^abc+$/.test("ab"));//false ab符合,c出现了零次,所以为false
    18. console.log(/^abc+$/.test("abccc"));//true ab符合,c出现了多次,所以为true
    19. console.log(/^abc+$/.test("abdccc"));//false ab符合,但是没有连续的abc,所以为false
    20. console.log(/^abc+$/.test("abcabc"));//false 不符合严格模式
    21. console.log(/^abc?$/.test("abc"));//true ab符合,c出现了一次,符合严格模式,所以为true
    22. console.log(/^abc?$/.test("ab"));//true ab符合,c出现了零次,符合严格模式,所以为true
    23. console.log(/^abc?$/.test("abcc"));//false ab符合,c出现了多次,所以为false
    24. console.log(/^abc{2}$/.test("abcc"));//true ab符合,c出现了2次,所以为true
    25. console.log(/^abc{2}$/.test("abc"));//false c只出现了1次,所以为false
    26. console.log(/^abc{2}$/.test("abccc"));//false c只出现了3次,所以为false
    27. console.log(/^abc{2,}$/.test("abccc"));//true c出现了大于2的次数,所以为true
    28. console.log(/^abc{2,}$/.test("abcc"));//true c出现了等于2的次数,所以为true
    29. console.log(/^abc{2,}$/.test("abc"));//false c出现了小于2的次数,所以为false
    30. console.log(/^abc{2,4}$/.test("abccc"));//true c出现了3次在2跟4之间,所以为true
    31. console.log(/^abc{2,4}$/.test("abcc"));//true c出现了2次在2跟4之间,所以为true
    32. console.log(/^abc{2,4}$/.test("abc"));//false c出现了小于2的次数,所以为false
    33. console.log(/^(abc){2,4}$/.test("abc"));//false abc出现了小于2的次数,所以为false
    34. console.log(/^(abc){2,4}$/.test("abcabc"));//true abc出现了2次在2跟4之间,所以为true

    常用正则 

    1. let str = '鸡你太美'
    2. console.log(escape(str));//'%u9E21%u4F60%u592A%u7F8E',使用escape方法可以将汉字转成Unicode编码
    3. console.log(unescape('%u9E21%u4F60%u592A%u7F8E'))//'鸡你太美',使用unescape方法可以将Unicode编码反向编译
    4. 验证汉字:/^[\u4e00-\u9fa5]+$/
    5. 验证邮箱:/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/
    6. 验证手机:/^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$/
    7. 电话号码(座机号码):/^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$/
    8. 身份证号码(18位数):/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$/

    正则常用方法

    test

    用于检测正则的匹配结果,正则身上的方法可直接正则点方法的形式使用,返回一个布尔值,符合正则条件则为true,否则为false,

    replace

    常用替换正则匹配到的字符

    1. let string = '马老师34878745@qq.com,鸡哥77777@163.com,vandark 100000@aliyun.com'
    2. // replace(翻译有替换的意思)
    3. // 第一个参数为正则表达式,
    4. // 第二个参数为需要替换的字符
    5. // /^\w{3,}(\.\w+)*@[A-z0-9]+(\.[A-z]{2,5}){1,2}$/邮箱正则表达式
    6. // /^$/ 表示严格匹配,只能匹配一次符合条件的,如出现多次结果是匹配失败
    7. let emailRegexp = /\w{3,}(\.\w+)*@[A-z0-9]+(\.[A-z]{2,5}){1,2}/g //g表示字符串中的所有的,全局的
    8. let result = string.replace(emailRegexp,'邮箱');//将匹配的邮箱换成汉字邮箱,
    9. console.log(string,'------',result);

    match

    可将正则匹配的条件以数组的形式返回

    1. // match(翻译有相配或者相似的意思)
    2. let string = '马老师34878745@qq.com,鸡哥77777@163.com,vandark 100000@aliyun.com'
    3. let emailRegexp = /\w{3,}(\.\w+)*@[A-z0-9]+(\.[A-z]{2,5}){1,2}/g //匹配字符串中所有的邮箱,g开启全局模式
    4. let result2 = string.match(emailRegexp);//
    5. console.log(result2)
    6. // 打印结果:['34878745@qq.com', '77777@163.com', '100000@aliyun.com']
    7. //返回结果是一个数组,没有找到则返回一个null
    8. // match分组提取
    9. let emailRegexpGroup = /(\w{3,}(\.\w+)*)@([A-z0-9]+)(\.([A-z]{2,5}){1,2})/
    10. //将相应的正则用括号括起来可以分段提取
    11. '77777@163.com'.match(emailRegexpGroup);//分组示例
    12. console.log(RegExp.$1)//(\w{3,}(\.\w+)*)表示邮箱的前缀---77777
    13. console.log(RegExp.$2)//这个为啥是空的我也不知道
    14. console.log(RegExp.$3)//([A-z0-9]+)表示邮箱@符号后面的邮箱类型---163
    15. console.log(RegExp.$4)//(\.([A-z]{2,5}){1,2})表示的后缀符号---.com
    16. // 练习
    17. let strValue = 'a=1,b=2,c=3';
    18. console.log(strValue.replace(/\w=\d/g,'结果'));//第二个参数为普通字符
    19. // 打印结果:结果,结果,结果
    20. console.log(strValue.replace(/(\w)=(\d)/g,'$2=$1'));
    21. //将等于号前后的正则匹配条件括起来,参数二换成$n,则可以翻转等于号前后字符
    22. //此处$1表示第一个括号匹配到的条件,此处$2表示第二个括号匹配到的条件,以此类推
    23. // 打印结果:1=a,2=b,3=c

    search

    用于查找正则条件在字符中出现的位置

    1. // search(翻译有搜索的意思)
    2. let string = '马老师34878745@qq.com,鸡哥77777@163.com,vandark 100000@aliyun.com'
    3. let result3 = string.search( /\w{3,}(\.\w+)*@[A-z0-9]+(\.[A-z]{2,5}){1,2}/);//匹配字符串中所有的基字,g表示替换所有的,全局的
    4. console.log(result3)//返回结果是一个正则匹配结果在字符串中出现的索引
    5. // 打印结果是3,邮箱在字符第一次出现的索引即是3

    split

    用于将正则条件匹配到的结果为分割将字符变成数组

    1. // split(翻译有分割的意思)
    2. let string = '马老师34878745@qq.com,鸡哥77777@163.com,vandark 100000@aliyun.com'
    3. let result4 = string.split(/[\d\w]+\b@[a-zA-ZA-z0-9]+\.[a-z]+/);//此处正则为邮箱正则
    4. console.log(result4)//返回结果是一个数组:['马老师', ',鸡哥', ',vandark ', '']
    5. // 练习
    6. let maStr = '闪-电-五-连-鞭-'
    7. console.log(maStr.split(/-/))//打印结果:['闪', '电', '五', '连', '鞭', '']
    8. //此处需要注意如果最后一个字符也符合正则匹配条件则数组最后一个为空

    exec

    有点像查找,但又不像,区别在于exec分次数查找,与test一样是正则身上的方法

    1. // exec()
    2. let string = '马老师34878745@qq.com,鸡哥77777@163.com,vandark 100000@aliyun.com'
    3. let emailRegexp = /[\d\w]+\b@[a-zA-ZA-z0-9]+\.[a-z]+/g
    4. console.log(emailRegexp.exec(string))//返回结果是一个数组,
    5. console.log(emailRegexp.exec(string))//每执行一次则从上一次执行结果的后面继续匹配查找
    6. console.log(emailRegexp.exec(string))//
    7. console.log(emailRegexp.exec(string))//如没有符合的条件时则返回null
    8. // 结果第一个值为匹配到的条件,
    9. // 结果第二个值为我也不知道,
    10. // 结果第三个值为匹配到的条件出现的索引,
    11. // 结果第四个值为传进去的字符串,
    12. // 结果第五个值为,
    13. // 可配合while循环使用
    14. let res
    15. while(res = emailRegexp.exec(string)){
    16. console.log(res[0])
    17. }

  • 相关阅读:
    leetcode:2441. 与对应负数同时存在的最大正整数(python3解法)
    fisco Java-sdk 快速入门案例
    气球派对服务小程序商城的效果是什么
    为华生物胆固醇聚乙二醇氨基CLS-PEG-NH2的简介及应用说明
    微服务从代码到k8s部署应有尽有系列(二、网关)
    如何建立开源战略
    Socket通信原理
    倒计数(来源:Google Kickstart2020 Round C Problem A)(DAY 88)
    windbgpreview过滤无用信息
    为什么现在很多企业都在做私域?
  • 原文地址:https://blog.csdn.net/weixin_52941842/article/details/132783505