前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >.*+?()[]{}^$|\(?<=)(?=)(?!<)(?!)

.*+?()[]{}^$|\(?<=)(?=)(?!<)(?!)

作者头像
用户8902830
发布2022-09-22 11:19:40
3750
发布2022-09-22 11:19:40
举报
文章被收录于专栏:CodeNoneCodeNone

号外

公众号的名字还是简单易懂,一看起来就知道是干嘛的,虽然CodeNone不错,但其实是模仿一个公众号的前辈,而且英文总是有点不舒服。为了更加的「自己」一点,特改名为

咖啡编程

❝两个含义,一个是cafe babe,一个是吸收宇宙能量,刚刚好全覆盖自身的情况,dddd。 ❞

正文

「是不是到处可见的正则表达式」

「是不是很羡慕别人熟练地使用正则表达式而自己不会」

「是不是想要入门正则表达式要么是长视频要么是一本书」

「是不是觉得这种方式看着很营销,很不舒服」

没错,上述除了正则表达式这五个字,其他全是废话,接下来要说的可能不一定很全,但是绝对能达到「28原则」,也就是掌握20%的知识应对80%的工作场景。但是,要想真正掌握这5个字,「无他,唯手熟而」

❝正则表达式所有都是紧挨着的,所有都是字符,抛弃掉“加空格漂亮,使用+号进行拼接”的想法 ❞

基础

写什么匹配什么

cat =>I have some pets, 「cat」s, dogs and pigs. ⭕️

Cat => The cat sat on the mat. ❌

123 => 56789「123」45 ⭕️

123 => 12456 ❌

元字符

这也是网上的说法,其实按照我的来就是特殊字符

. * + ?

.表示匹配除换行外任一字符 ❞

.at => 表示at紧跟着某个字符 => The 「cat」 「sat」 on the 「mat」. => 有3处匹配

c.t => 表示c紧跟着某个字符紧跟着t => The 「cat」 sat on the mat. => 有1处匹配

*匹配前面的表达式0次或者多次 ❞

[a-z]* => 表示匹配0个或者多个字符 => T「he cat sat on the mat」 => 有13处匹配

没错,就是有13处匹配,1: “” 2: “he" 3: "" 4: "cat" 5: "" 6: "sat" 7: "" 8: "on" 9: "" 10: "the" 11: "" 12: "mat." 13: ""。

.是表示任意一个字符,*是表示0个或者多个前面一个字符,那么.*就表示任意字符

.\* => 任意字符 => 「The cat sat on the mat」 => 2处匹配

1: "The cat sat on the mat" 2: ""

+*的作用是一样的,不过*是匹配0个或以上的字符,+是匹配1个或以上的字符,其他就不在赘述 ❞

?号作用也是如此,不过?是字符可选,则匹配0个或者1个字符 ❞

() [] {}

()括号中的内容视作一个整体 ❞

(c.)t => 表示c跟着的某个字符作为一个整体,后面再跟一个t === c.t 。没错,在这个例子里面和这个完全等价 => The 「cat」 sat on the mat => 1处匹配

(c|s|m)at=> 表示括号中的字符中的任一个跟at => The cat sat on the mat => 3处匹配

(c.|.a)t => 符合c.t或者.at这两种正则表达式 => The cat sat on the mat => The cat sat on the mat => 3处匹配

❝[] 匹配中括号内的任一内容 ❞

[csm]at => 表示cat/sat/mat => The cat sat on the mat => 3处匹配

[cm]at[.b] => 表示cat./catb/mat./matb四种情况 => The cat sat on the mat. Hello world => 1处匹配 => 「括号里的.和*都是字符,并没有上述特殊含义」

❝{num} 是个量词动作,表示匹配num个前面的字符,{a, b}表示匹配大于等于a,小于等于b个前面的字符,都符合的情况下,匹配b个前面的字符 ❞

[ld]{2,5} => 表示2~5个l或者2~5个d或者2~5个两个字符组合的(并不是作为一体) => He**ll「o Wor」ldddd** dddd! => 注意这里的d是全部连起来的,为了区分展示的时候是空格 => 3处匹配 => ll ldddd dddd

第一个匹配没啥好说的,2个l,第二个为什么是ldddd而不是ld,ldd,是因为符合的情况下优先大的边界Math.max(2, 5) = 5

^ $

❝^ 以某个字符开始的字符串 ❞

^T=> 以T开始的字符串 => 「T」he cat sat on the mat => 匹配1处,「只会匹配一个T」 => 如果是^The 自然也只能匹配The3个字符

在正常情况下^都是表示以上含义,但是在[]里使用的时候,就是取反的意思

[^(^T)]t => 不以T开始的字符串但是后面跟着t => The c**at** s「at」 on **t**he m「at」 => 匹配4处

❝$以某个字符结尾的字符串就不再赘述 ❞

但是值得注意的是放在[]里没有任何特殊意义,单纯指的是''这个字符

| \

| 就是代码中的或,没有其他意义 ❞

(c|s|m)at => cat/sat/mat => The 「cat」 「sat」 on the 「mat」 => 3处匹配

\ 表示转译字符 ❞

这个对于开发人员来说比较简单,这里就不在赘述

一般处理单纯地转译之外,还会配合一些字符来表示某个含义

\d => digital => 匹配数字 => \D => 前者取反,即匹配非数字

\w => words => 匹配数字和大小写英文字母 => \W => 前者取反

\s => space => 匹配空格字符 => \S => 前者取反

还有一些平常使用的

\n => next line => 换行

\t => tab => 制表符,在程序里面写的话,一般是4个字符

\r => return => 匹配回车符

断言

所谓断言简单来说就是「匹配但是不包含」,这个可能平常会使用得比较多,比如场景需要匹配xxres,但是不要xx只要res。

断言分为正向断言和负向断言,所谓「正负向断言分别对应存在不存在」;又分为「先行后行断言,分别对应不要的东西在前面还是后面」,比如xxres不要xx只要res就需要使用先行断言。

组成格式以?开头,正向断言为=,负向断言为!,先行断言为<,同时「一定要包裹在()内」

  • ?=:正向先行断言
  • ?<=:正向后行断言
  • ?!:负向先行断言
  • ?<!:负向后行断言

?<= 正向后行断言,不要的东西在前面的时候使用 ❞

(?<=[csm])at => 匹配cat/sat/mat,但是不要第一个字母,输出at => The c「at」 s「at」 on the m「at」. => 3处匹配

?= :正向先行断言,不要东西在后面的时候使用 ❞

[\w](?=at) => 任一一个字母或者数字后面跟着at,但是只要字母,后面的at不要 => The 「c」at 「s」at on the 「m」at. => 匹配3处

?<! 负向后行断言,不匹配的东西在前面 ❞

(?<![tT]he\s)[csm]at => 不包含The 或者the 但是后面跟着sat或者mat => The cat, cat sat ont mat => 3处匹配,第一个cat没有匹配是因为前面是The 。注意,这里的The或the后面是跟着空格的。

?! 负向前行断言,不配的东西放在后面 ❞

(T|t)he(?!\scat) => 匹配The或the,且后面不跟着(空格)cat => The cat sat on 「the」 mat. => 匹配一处,因为前面的The后面跟着(空格)cat

除此之外,还有一个是比较类似的格式(?:)是说匹配,但是也要,但是说是什么非捕获匹配,总之我是没法理解的,在菜鸟教程里有这样一段话

但是我试了试,不用?:也是没啥区别呀

「创作不易,如果对你有帮助,欢迎点赞,收藏和分享啦!」

「下面是个人公众号,有兴趣的可以关注一下,说不定就是你的宝藏公众号哦,基本2,3天1更技术文章!!!」

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-08-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 咖啡编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 号外
  • 咖啡编程
    • 正文
      • 基础
        • 元字符
          • 断言
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档