当前位置: 首页 > news >正文

Javascript高级:正则表达式基础与应用

少去去游荡,中年想掘藏,老年做和尚

文章目录

        • 前言
        • 正则的符号
          • 参数
        • 正则表达式创建对象方式
        • 字符串方法
        • 验证汉字
        • 总结

前言

正则表达式(Regular Expression,通常缩写为regex或regexp)是一种强大的文本处理工具,用于匹配、查找、替换符合一定模式的字符串。它在编程语言中广泛使用,特别是在文本处理任务中,如数据验证、搜索替换等。


正则的符号
  • 预定义类 (元字符)
    • [^\n\r] :除了换行和回车之外的任意字符
      // 如果检测的字符串里面包含 除了换行和回车之外的任意字符 那就返回true,否则返false
      console.log(/./.test('\r'))  // false
      console.log(/./.test('\r\n'))  // false
      console.log(/./.test('' + ''))  // false
      console.log(/./.test('\r1'))  // true
      console.log(/./.test('32435dh1'))  // true
      console.log(/./.test('d'))  // true
      
    • \d [0-9]:数字字符 [0123456789]
      // 检测的字符串里面如果有数字,就是true, 如果没有数字,就是false
      console.log(/\d/.test('abc'))  // flase
      console.log(/\d/.test('!@#$'))  // false
      console.log(/\d/.test('!@#$adfgethfe')) // false
      console.log(/\d/.test('!@#$adfgethfe1'))  // true
      console.log(/\d/.test('123456'))  // true
      
    • \D [^0-9]:非数字字符
      // test检测:只要被检测的字符串中包含了非数字字符,那么结果就是true
      console.log(/\D/.test('abc'))  // true
      console.log(/\D/.test('!@#$'))  // true
      console.log(/\D/.test('!@#$adfgethfe'))  // true
      console.log(/\D/.test('!@#$adfgethfe1'))  // true
      console.log(/\D/.test('13243546b576871'))  // true
      console.log(/\D/.test('123456'))  // false
      
    • \s [\f\r\n\t\v]:不可见字符
      console.log(/\s/.test('abc\r'))  // true
      console.log(/\s/.test('abc\n'))  // true
      console.log(/\s/.test('abc\r\n'))  // true
      console.log(/\s/.test(' '))  // true 
      console.log(/\s/.test('' + ''))   // false 他是一个空字符串,没有不可见字符
      
    • \S [^\f\r\n\t\v]:可见字符
      console.log(/\S/.test('abc\r'))  // true
      console.log(/\S/.test('abc\n'))  // true
      console.log(/\S/.test('abc\r\n'))  // true
      console.log(/\S/.test(' '))  // false
      console.log(/\S/.test('\r\n\t\r'))  // false
      console.log(/\S/.test('abcdeg'))  // true
      
    • \w [a-zA-Z0-9]:单词字符
      console.log(/\w/.test('!@#$%#@#$%$#@'))  // false
      console.log(/\w/.test('!@#$%#@#$%$#@a'))  // true
      console.log(/\w/.test('!@#$%#@0#$%$#@'))  // true
      console.log(/\w/.test('!@#$%#@_#$%$#@'))  // true
      console.log(/\w/.test('!!!!!1234567'))  // true
      console.log(/\w/.test('!!!!!'))  // false
      
    • \W [^a-aA-Z0-9]:非单词字符
      // 检测的字符串里面如果有非单词字符,就返回true
      console.log(/\W/.test('abcserge3'))  // false
      console.log(/\W/.test('fsdgetherg!'))  // true
      console.log(/\W/.test('!123456@'))  // true
      console.log(/\W/.test('!!!!!1234567'))  // true
      console.log(/\W/.test('!!!!!'))  // true
      
  • 自定义类
    // 用test检测的字符串里面,有没有包含d这个字母。如果有就是true
    console.log(/d/.test('123')) // false
    console.log(/d/.test('123d')) // true
    // 用test检测的字符串里面,有没有包含heiya,如果有就是true
    // 一定是连续的完整的至少出现一次,结果才是true
    console.log(/heiya/.test('hei')) // false
    console.log(/heiya/.test('林黑群真hei')) // false
    console.log(/heiya/.test('he1iy2a')) // false
    // 用test检测的字符串里面,如果有heia,或者heya,那么就是true
    console.log(/he(i|y)a/.test('hei'))  // false
    console.log(/he(i|y)a/.test('heiya'))  // false
    console.log(/he(i|y)a/.test('heia'))  // true
    console.log(/he(i|y)a/.test('heya'))  // true
    
  • 或(|)和优先级()
    // 用test检测的字符串里面,如果有hei或者有ma都是true
    console.log(/hei|ya/.test('hei'))  // true
    console.log(/hei|ya/.test('ya'))  // true
    console.log(/hei|ya/.test('heiya'))  // true
    console.log(/hei|ya/.test('heiheiyaya'))  // true
    console.log(/hei|ya/.test('heiyaheiya'))  // true
    console.log(/hei|ya/.test('林黑群真yhei'))  // true
    console.log(/hei|ya/.test('he1iy2a'))  // false
    
  • 简单类 []:只代表一个字符
    console.log(/[abc]/.test('a'))  // true
    console.log(/[abc]/.test('d'))  // false
    console.log(/[abc]/.test('dddddbdddd!!!!!!')) //t rue
    console.log(/[abc]/i.test('dddddBdddd!!!!!!'))  // true
    // 因为这里是一个自定义类,所以要出现至少是y中间是a或者b或者cz连起来的三个字符
    // 检测的字符串中有:yaz ybz ycz,就是为true
    console.log(/y[abc]z/.test('yaz'))  // true
    console.log(/y[abc]z/.test('yz'))  // false
    // 或可以这样写
    console.log(/y(aa|bb|cc)z/.test('yaaz'))  // true
    console.log(/y(aa|bb|cc)z/.test('ybbz'))  // true
    console.log(/y(aa|bb|cc)z/.test('yccz'))  // true
    console.log(/y(aa|bb|cc)z/.test('ybaz'))  // false
    
  • 负向类 [^]
    // 如果用test检测的字符串中,有除了中括号中的内容之外的任意一个,出现一次或者一次以上,就是true
    console.log(/[^abc]/.test('a'))  // false
    console.log(/[^abc]/.test('abcaaabbbcccaaabc'))  // false
    console.log(/[^abc]/.test('abcaaabbbcccaaabc!'))  // true
    console.log(/[^abc]/.test('ad'))  // true
    console.log(/[^abc]/.test('a1'))  // true
    
  • 范围类:表示一个范围
    console.log(/[a-z]/.test('1111'))  // false
    console.log(/[a-z]/.test('1111h'))  // true
    
  • 组合类
    console.log(/[a-m1-5]/.test('b')) // true
    console.log(/[a-m1-5]/.test('6666')) // false
    console.log(/[^0-5][^a-g]/.test('6'))  // false
    console.log(/[^0-5][^a-g]/.test('6z'))  // true
    console.log(/[^0-5][^a-g]/.test('4yaaabbbc7cc'))  // true c是0-5之外的,7是a-g之外的,所以c7是满足的
    
  • 边界:/^/ 以什么开头;/$/ 以什么结束
     // ^ 会匹配行或者字符串的起始位置
    console.log(/\d/.test('aaabb123ccc'))  // true 预定义类,只要检测的字符串中出现了数字就是true.
    console.log(/^\d/.test('aaabb123ccc'))  // false 如果检测的字符串的起始位置是数字就是true.
    console.log(/^\d/.test('1aaabb123ccc'))  // true
    console.log(/^6/.test('6'))  // true
    console.log(/^6/.test('76'))  // false
    console.log(/^6.a/.test('666abat '))  // false
    // $ 会匹配行或字符串的结尾位置
    console.log(/ac/.test('ac777'))  // true
    console.log(/ac$/.test('ac777'))  // false
    
  • 严格匹配:/^ $/组合在一起,就表示严格匹配 只能是他不能有别的东西,并且他只能出现一次,有且只有一次
    console.log(/^男$/.test('大锐是男的')) //f alse
    console.log(/^男$/.test('男')) //t rue
    console.log(/^男$/.test('鹏鹏是男男男男的')) //f alse
    console.log(/^男$/.test('男女')) //f alse
    console.log(/^男$/.test('男男')) //f alse
    console.log(/^男$/.test('男')) //t rue
    console.log(/^abc$/.test('abc1')) //f alse
    console.log(/^abc$/.test('abcabc')) //f alse
    console.log(/^bc$/.test("bcbcbc"))  // 严格匹配 false
    console.log(/^\d{2}$/.test('22'))  // true
    console.log(/^\d{2}$/.test('223'))  // false
    console.log(/^\d{2}$/.test('22b'))  // false
    console.log(/^\d$/.test('9'))  // true
    console.log(/^abc\d$/.test('abc7'))  // true
    console.log(/^abc\d$/.test('abc7abc9'))  // false
    console.log(/abc\d/.test('abc7abc9'))  // true
    
  • 量词
    • *:重复零次或更多
      console.log(/color/.test('color'))  // true
      console.log(/^colo*r$/.test('colooorcolooor'))  // false 不符合严格匹配
      console.log(/^colo*r$/.test('olooor'))  // false 不符合严格匹配
      
    • +:重复一次或更多次
      console.log(/^colo+r$/.test('colr'))  // false
      console.log(/^colo+r$/.test('color'))  // true
      console.log(/^colo+r$/.test('colooorcolooor'))  // false 不符合严格匹配
      
    • ?:重复零次或更多次
      console.log(/^colo?r$/.test('colooorcolooor'))  // false 不符合严格匹配
      console.log(/^colo?r$/.test('colorcolor'))  // false 不符合严格匹配
      
    • {n}:n次
      console.log(/^colo{2}r$/.test('color'))  // false
      console.log(/^colo{2}r$/.test('coloor'))  // true
      console.log(/^colo{2}r$/.test('coloorcoloor'))  // false 不符合严格匹配
      console.log(/^colo{2}r$/.test('coloorc'))  // false 不符合严格匹配
      
    • {n,}:重复n次或更多
      console.log(/^colo{2,}r$/.test('color'))  // false
      console.log(/^colo{2,}r$/.test('coloor'))  // true
      console.log(/^colo{2,}r$/.test('coloorcoloor'))  // false 不符合严格匹配
      
    • {n,m}:重复出现的次数比n多但比m少
      console.log(/^colo{2,3}r$/.test('colooor'))  // true
      console.log(/^colo{2,3}r$/.test('coloooor'))  // false
      console.log(/^colo{2,3}r$/.test('coloorcoloor'))  // false 不符合严格匹配
      
参数
  • i:忽略大小写
  • g:全局匹配 global
  • gi:全局匹配 + 忽略大小写
正则表达式创建对象方式
  • 使用构造函数创建 var 变量名 = new RegExp(/表达式/)
    var reg1 = new RegExp('男|女')
    var res = reg1.test('森哥是nan的吗?')
    console.log(res)
    
  • 使用字面量方式创建 var 变量名 = /表达式/
    var reg2 = /<.{4}>/
    var res = reg2.test('哈哈哈嘿嘿嘿嘻嘻嘻')
    console.log(res)
    
    注意: // 是注释 里面放东西就是正则
字符串方法
  • replace (替换)
    // 要求:把下面字符串中的b都换成B
    var str = 'abfdshbafhb'
    var newSrt = str.replace(/b/g, 'B') // 全局匹配 global 缩写g
    console.log(newSrt)
    // 要求:那下面字符串中的数字都改成1000
    var str1 = '小甜甜100 爱丽丝100 冰雪公主100'
    var newStr1 = str1.replace(/\d+/g, '1000')
    console.log(newStr1)
    
  • match (提取)
    // 有返回值,返回值是一个数组,提取出符合正则要求的数据组成的数组;如果字符串没有符合这个正则规则的数据,那就返回一个null// 提取工资
    var str = '小甜甜100 爱丽丝200 冰雪公主300'
    var arr = str.match(/\d+/g)
    console.log(arr)
    // 提取email地址
    var str1 = "123123@xx.com,fangfang@valuedopinions.cn 楼主好人一生平安286669312@qq.com 楼主求个种子2、emailenglish@emailenglish.englishtown.com 286669312@qq.com..."
    var arr1 = str1.match(/^\w+(\.\w+)+$/g)
    console.log(arr1)
    
  • search (检索)
    // 需求:获取下面这个字符串第一次出现数字的位置
    var str = '龙翔100俊杰200冰川300豆蔻400'
    var res = str.search(/\d+/)
    console.log(res)
    
  • split (分割)
    var str = '龙翔100俊杰200豆蔻300冰川'
    var arr = str.split(/\d+/)
    console.log(arr)
    
验证汉字
  • 不管是哪一个汉字,在js中都有一个唯一的Unicode编码
  • 通过escape('汉字')查看一个汉字的Unicode编码
  • 通过UNicode('编码')转回汉字
  • 所有的汉字都在[\u4e00-\u9fa5]这个范围中
console.log(/[\u4e00-\u9fa5]/.test('ewrfewrferewrewr')) // false
console.log(/[\u4e00-\u9fa5]/.test('ewrfewrferew国rewr')) // true
console.log(/^[\u4e00-\u9fa5]{2,4}$/.test('东方不败')) // true
console.log(/^[\u4e00-\u9fa5]{2,4}$/.test('sb东方不败lh')) // false

总结

本文档不仅涵盖了正则表达式的基本理论知识,而且还提供了大量实用的操作指导,旨在帮助读者全面提升正则表达式技能,正则表达式虽然强大,但其语法可能会比较复杂,需要时间和实践来掌握。不同的编程环境对正则表达式的支持也有所不同,因此在使用时需要注意查阅相关文档。


http://www.mrgr.cn/news/60306.html

相关文章:

  • 51单片机之蜂鸣器驱动
  • 深入浅出神经网络:从基础原理到高级应用
  • 【面试】RabbitMQ有哪些消息模型
  • 插槽 - 2024最新版前端秋招面试短期突击面试题【100道】
  • java中使用redis的方法
  • FFmpeg 深度教程音视频处理的终极工具
  • OOP特性 多态
  • c语言错题——#define对应的查找替换
  • 【JavaEE】【多线程】线程池
  • WebGIS开发之编辑功能(分割、融合、捕捉、追踪)
  • 2023年中国县域统计年鉴(县市卷+乡镇卷)(excel格式)
  • 声学气膜馆:品牌发布会的理想之选—轻空间
  • Labview通讯测试耗时
  • 支持向量机SVM简述
  • Spring Boot摄影工作室:构建Web版在线服务平台
  • jieba:智能文本处理的利器,结巴中文分词
  • 培育增长新动能,英搏尔数字化管理升级与创新的实践
  • Go语言编译详解
  • PHP员工管理系统小程序
  • 充电宝哪个牌子好?2024精选五款优质充电宝,入门避坑必看攻略!
  • 了解 SQL 查询执行顺序
  • 突破AI极限!GPT写的英语作文在全国大学生大赛中得分99!
  • 【论文阅读】jina-embeddings-v3: Multilingual Embeddings With Task LoRA
  • 代码随想录(十二)——图论
  • VLAN聚合的实验配置
  • 前端内存空间(堆、栈、队列、拷贝、垃圾回收)