精通正则表达式,看完这篇就行了
新年快乐,开工大吉
对于正则表达式,不知道你有没这种感觉,总是能按照需求写出来一些,但是不执行一下总觉得不靠谱。今天我们来简单的看看正则表单时 正则表达式
一般你会用正则做什么,大部分都是做一些字符串的检查?下面有几个问题,不妨试着通过正则表达式看你是否能够解决? 校验密码是否包含字母大小写、数字、特殊字符(!@# %^&)且长度为6到12位 将数字12345678用货币格式(每3位一个,)最终效果:12,345,678 替换一段文字中的占位字符部分(比如${}包含的内容),类似ES6中的模板语法 定义
正则表达式 ,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式, 包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑。 作用
回顾下上面的3个问题,我们使用正则基本上也就是完成类似的这些工作,从功能上我们可以划分为: 匹配 检查目标字符串是否与指定的规则匹配。比如密码强度校验、手机号码校验、URL地址校验等等,一般用来对一段字符串进行格式校验。 替换 按规则对字符串内容进行替换。比如将一段文字中的特殊字符替换成空字符串,主要实现对文本按指定规则进行内容的替换 截取 找到字符串中特定规则的片段。可以用来提取目标字符串中满足规则的片段 结构
正则表达式由普通字符以及元字符组成。其中普通字符包含0-9、a-z、A-Z以及各种符号;元字符则类似+ ? d s 这种具有特殊含义的字符。 字符普通字符
非打印字符
特殊字符
限定符
定位符
规则匹配 贪婪匹配、惰性匹配贪婪匹配与惰性匹配影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配 (惰性模式:限定符后加上?) 源字符串:...hello Regex !... 贪婪模式:.* -> hello Regex ! 惰性模式:.*? -> hello Regex 回溯正则表达式匹配目标字符串时,它从左到右逐个测试表达式的组成部分,看是否能找到匹配项。在遇到量词时,需要决定何时尝试匹配更多字符。在遇到分支时,必须从可选项中选择一个尝试匹配。每当正则做类似的决定时,如果有必要,都会记录其他选择,以便匹配不成功时进行回溯,到最后一个决策点,再重新进行匹配。
我们可以简单的理解为,当正则匹配存在多种情况时,出现失败后的重试机制,直到所有情况都尝试失败才会最终失败。要注意有时这是非常耗费性能的 正则:ab{1,3}c 源字符串:abc 第一次匹配:a匹配到a 第二次匹配:b{1,3}匹配到b 第三次匹配:b{1,3}匹配到c,因为贪婪模式,尽可能多的匹配,当匹配到b后,会继续,碰到c,匹配失败,回溯最近一次成功的状态 第四次匹配:b{1,3}匹配到b 第五次匹配:c匹配到c,批次成功 为了减少回溯造成的性能问题,我们应该尽可能地明确需要匹配的目标字符,避免贪婪模式,比如使用b{1,3}? 分组、引用和断言 分组:语法() 按括号从左到右,从外到内依次为分组编号 使用(?<组名>)方式显示分配组名称 断言非分组 示例: (A)(B(C)) 则会对应多个分组: 0: (A)(B(C)) 1: (A) 2: (B(C)) 3: (C) 引用:语法组号 通过组号引用分组,减少重复 // 引用主要是为了减少输入,但要注意正确引用 Pattern.compile("(###).*(1)").matcher("### this is content ###") 断言: (?=pattern) 零宽正向先行断言(前瞻) (?!pattern) 零宽负向先行断言(否定前瞻) (?<=pattern) 零宽正向后行断言(正向后视) (? 第一个问题的解决方案就用到了断言 只判断,不匹配 模式
在javascript中,有i、g、m、s分别对应了不区分大小写、全局匹配、多行匹配以及包含换行符的元字符.匹配,而在Pattern中则提供了下面的几种模式: UNIX_LINES 换行符统一认定为 ,(window系统默认是r ) CASE_INSENSITIVE 大小写不敏感,对应i COMMENTS 表达式中的空格及#开头的注释内容被忽略 MULTILINE 多行模式,对应m LITERAL 字面值解析模式,元字符作为普通字符处理 DOTALL .可以匹配任何字符,包括行结束符,对应上面的s UNICODE_CASE 配合CASE_INSENSITIVE实现对UNICODE大小写不敏感 CANON_EQ 启用规范等价,比如"a "会匹配"?" UNICODE_CHARACTER_CLASS 启用Unicode版本的预定义字符类和POSIX字符类,这样类似w的匹配就不局限于英文字符了 元字符
所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。下面整理了元字符以及其对应的功能。
示例
下面来看下上面3个问题通过正则具体如何解决吧... 问题1,主要使用了断言来实现,当然你也可以拆分成多个正则进行匹配来达到相同的效果 @Test public void checkPassword(){ String password = "aaa123@Z"; Pattern compile = Pattern.compile("(?=.*d+)(?=.*[a-z]+)(?=.*[A-Z]+)(?=.*[!@#$%^&]+)[a-zA-Zd!@#$%^&]{6,12}"); log.info(">>> {}", compile.matcher(password).matches()); } 问题2,同样借助了断言,实现字符串的查找,最终实现替换,当然我们替换的不是字符,而是匹配的位置 @Test public void scientific(){ String number = "123456789"; String result = number.replaceAll("(?=B(d{3})+$)", ","); log.info(">> {}", result); } 问题3,通过分组实现字符串片段的查找,通过变量上下文重新组件字符串 @Test public void replaceHolder(){ Map context = new HashMap<>(); context.put("company","north"); context.put("project","blob"); context.put("model","regex"); String packages = "com.{company}.{project}.{model}.*"; Pattern pattern = Pattern.compile("({[^}]*})"); Matcher matcher = pattern.matcher(packages); StringBuffer result = new StringBuffer(); while (matcher.find()){ String group = matcher.group(); String key = group.substring(1, group.length()-1); matcher.appendReplacement(result, context.getOrDefault(key,"") ); } matcher.appendTail(result); log.info( result.toString() ); } 工具库
https://www.runoob.com/regexp/regexp-operator.html 扩展知识
NFA引擎 DFA引擎 结束语
正则表达式是一种书写简单,功能强大且常用的技术,基本所有的编程语言都有其相关的实现与支持。因此深入了解正则实现原理与书写规范非常重要。
该篇主要通过简单的几个示例介绍了正则表达式的功能以及一些基本结构与功能,希望能够抛砖引玉,让你对正则表达式有更深的认识。 来源;https://mp.weixin.qq.com/s/XuRENQXqh8EXesnDztfi3Q
作者:指北君
人工智能,为科研注入智慧动能(科技自立自强)来源人民日报既带来新的研究方法,也助力经济高质量发展人工智能,为科研注入智慧动能(科技自立自强)核心阅读日前,科技部等六部门发文,着力打造若干重大场景,拓展人工智能应用,高水平科研
丰田在2030年之前不会推出电动GR车型日前据外媒报道称,丰田在2030年之前不会推出电动的GR车型。丰田认为,在碳中和的道路上,也必须有一个混合动力系统,让用户来选择什么是最适合他们的,特别是很多充电设施不发达的地方。
欧洲销量最高的中国电动车一个月卖出超1500辆,比亚迪只排第三曾经不止一次地说过,新能源汽车是中国汽车工业实现换道超车赶超西方汽车工业的最佳机遇,幸运的是,中国已经成功把握住了机会,在新能源汽车市场形成了强大的优势。用一组数据来印证中国新能源
晶圆代工ARVR等行业未来走向如何?2023年集邦拓墣科技产业大预测发布智通财经APP获悉,TrendForce集邦咨询公告2023年集邦拓墣科技产业大预测。其中,TrendForce集邦咨询预估,2023年全球晶圆代工8吋年均产能增幅约312吋约年增
共享版老头乐来咯!法国推出一人座共享电动车自共享单车出现在大众生活中,城市上下班路上多了许多踩踏单车的身影,民众更多选择骑车出行,作为短距离或通勤的最佳选择,不仅经济实惠,而且绿色低碳,到疫情期间国外也掀起共享热潮,不过更
华为进军NAS领域相比之下极空间Q2性价比更高近日,华为集团正式进军NAS领域,其推出的家庭存储私有云产品,依托华为自研的鸿蒙系统,力图在其产品链条上再增加一员大将。NAS领域显然是一片蓝海市场,华为等大厂已经逐渐聚焦这里,就
医药史诗级大反攻,下周关注什么?今天的反弹大涨在预料之中。直播间早评消息的时候就点评了,今天还会延续反弹。但为啥很多人还是害怕入场呢?现在为啥大家涨一点就害怕会下跌,犹豫不决呢?因为A股股民被伤害的已经不相信有光
如何赞美别人?看高情商的人,是如何做的我们在私聊时经常遇到需要我们去夸的人,却不知道怎么开口,反而会显得自己很尴尬。坦释空总结了以下经验,无论在生活中还是在工作中都可以帮助我们高情商地赞美别人。1,赞美一定要真诚至上,
最近想到的一些话1hr越来越觉得,脑子是个日用品,不要把它当成装饰品。2hr哪怕你是对的,也不用非要证明别人是错的。争口舌之快,不是明智之举。3hr遇见奇葩,离得越远越好。因为奇葩的世界观和下限是
奋发图强的意义现在的年轻人动不动就躺平,不想努力奋斗,如果人人都不努力,都想躺平,国家怎么办,这还不算,还有的去追星,请问,国家处于危难处于灭亡的时候,这些你喜欢的明星会来拯救你吗?你会狡辩的说
希望这篇感想能唤醒刚进入大学正在迷茫和摆烂的你我发现大学的生活就是在引导我们形成自律的生活习惯,包括从吃到睡到行再到学的自律。先说吃,大学的食堂不再是像高中那样准时准点供饭,只要你想吃,几乎就是饭来张口的程度,然而你一旦放纵了
越长大越孤单随着年龄的增长,似乎越来越喜欢繁花似锦觅安宁,淡云流水度此生的生活。也没有太多原因,只是在人生这段旅程中,走得越远,发现与别人越不相合。每个人按自己的模式生活久了,发现别人与之不同
正式签约!广东宏远签下新外援,场均22分16篮板,朱芳雨发力了北京时间11月7日,在今年夏天,不少CBA球队都进行了大调整,重新调整球队阵容,甚至有些球队投入了大量资金,不过随着新赛季的开始,很多球队阵容都开始暴露问题,尤其是外援问题,因此随
34分32分39分,客场6连败!库里难挑千斤担,卫冕冠军别再任性新赛季,新格局,新的征程意味着新的机遇与挑战。勇士快船76人雄鹿绿军等豪门球队都是争冠大热门,阵容实力和深度都不容小觑。截至目前,雄鹿队佛挡杀佛神挡杀神,孤独求败,豪取9连胜快船7
联通物联网卡为什么会锁卡?原因你知道吗?物联网卡也就是物联卡,这也是电话卡的一种,但与其它电话卡不同,物联网卡不是用于手机当中的,而是用于各种需要联网的设备当中,而用于手机当中容易出现锁卡等情况。但物联网卡因为与流量卡一
双十一手机怎么选?这几款不错,价格合适配置还高一年一度的双十一快到了,很多人都会在这个日子里选择购买一款适合自己的手机,虽说是要买,但是很多人都会纠结,究竟应该买哪款手机好,而不同的机型都有着不同的特点,笔者接下来就给大家盘点
王者荣耀世界代号破晓新消息将至!王者IP新游10号首发王者荣耀迎来7周年后近期也是看点和动作频频,官方在游戏中也是放出了共创之夜的系列活动预告,11月12日共创之夜直播即将到来。根据官方预告,王者荣耀将于11月11日官宣王者荣耀世界的
行业动态天逸创新赋能国民家庭娱乐,引领中国好声音随着第十一季中国好声音的学员梁玉莹获得年度总冠军,今年的节目也圆满落下帷幕。天逸音响携手IPTV强势登陆中国好声音2022,一路以见证者的身份,助力好声音。然而,天逸的好声音旅程远
中超23轮战罢,四级分化谁夺冠?谁降级?今天看了中超积分榜,出现了四级分化。冠军之争虽然前期三镇很猛,霸占积分榜23轮之多,也展现了自己的实力。但是相对山东,必须更加稳定。不该输的球还是不能输。战术上三镇一直倚仗外援的表
牙买加短跑田径为什么碾压美国美国人口约3。33亿,其中拥有短跑天赋的非洲裔占13。4,约4462。2万。拥有顶尖运动训练条件科技辅助手段和成熟选拔体制的美国田径队曾雄霸天下,往往囊括短跑项目的所有奥运金牌,直
jQuery事件的解绑和触发jQuery事件的解绑和触发off()事件解绑11解绑全部事件处理函数语法元素集合。off(事件类型)会把p的click事件对应的所有事件处理函数全部移除body我是p标签body
从入围赛到世界之巅,DRX这一年真的是神迹不可思议的奇迹!冒泡赛打满两个bo5再从入围赛杀出来的四号种子冠军!恭喜Deft最后一舞最终圆梦!恭喜Beryl三年三进总决赛捧起第二座S冠!恭喜Kingen从公认的短板一路进化到