文章目录
- 心得体会
- [1.懒惰匹配最少字符 `.+?`](#1.懒惰匹配最少字符
.+?) - [2.前瞻: 字符串后边 包括/不包括 某个单词/字母](#2.前瞻: 字符串后边 包括/不包括 某个单词/字母)
-
- [2-1.包含某单词: start(?=.+?hello)](#2-1.包含某单词: start(?=.+?hello))
- [2-2.不包含某单词: start(?!.+?hello)](#2-2.不包含某单词: start(?!.+?hello))
心得体会
前情回顾:
【MedusaSTears】正则?不要太简单!---正则表达式个人学习心得总结:
- 正则说白了是对字符串的整理,所以对一个无间隙长串,第一步最主要的就是,【分割】字符串,类似于英语的自然拼读法那种,从业务需求方面,理解并分割字符串
比如: 邮箱为什么要以@前后分界?谁告诉你的?因为你知道这是默认的,然而这恰恰是容易被忽略的重点- 正确【分割】后,就不难找到关键字符或者关键位置,也就是可能需要replace的地方,这是启动的核心,下手的第一步
- 对于不确定的字符串长度,先找到可以确定的或者唯一的部分
- 贪婪匹配
vs懒惰匹配:
默认情况下,正则表达式使用最长匹配原则(也叫贪婪匹配原则)。
懒惰匹配: 在量词*、+、?、{n}、{n,}、{n,m}后面加?就是懒惰模式,懒惰对应的就是匹配的尽可能少的情况。- 注意
? * + {1,32}这些量词实际上包括本身- 注意
.不包括\n \r- 注意
.是任意单个字符,[]是指定中括号内的字符?:是忽略分组,也就是说括号内的内容不是一个group,包括在实际匹配,用处是 取值的时候忽略这个组合需求: 查找指定字符串
之前/之后的str, 且不包括条件里面的字符串举例: 想要
<title>hello world</title>标签里面的内容答案:
(?<=\<[tT][iI][tI][lL][eE]>).*?(?=</[tT][iI][tI][lL][eE]>)解析: 如果跟位序有关,则务必用 前瞻(Lookahead)
?=或者 后顾(Lookbehind)?<=后顾性能损耗比较大,js只支持前瞻(知乎上看到的,具体原因不详)
本题是 查找指定字符串
<title>之后和</title>之前的内容前瞻分两种:一种是正向前瞻 positive lookahead(
?=xxx) 其后必须存在的内容,是一个条件,不是实际匹配中的内容另一种是负向前瞻 negative lookahead(
?!xxx)
?=</[tT][iI][tI][lL][eE]>是前瞻, 也就是计算机从左到右读取第n位字符的时候,n右侧的都是?=
1.懒惰匹配最少字符 .+?
- 注意
.不包括\n \r- 注意
.是任意单个字符,[]是指定中括号内的字符
+是至少出现1次.+的意思:至少1个字符比如:
hello.+friend返回的结果是: 字符串中 命中hello开头,friend结尾的最长字符串,但是hello和friend中间,必须至少有一个字符,不存在hellofriend这种情况
?则代表懒惰匹配,将.+匹配长度最小化比如:字符串
hellomyfriendweareallfriends,如果用
hello.+friend匹配就是不包括最后s的整个字符串hellomyfriendweareallfriend;如果用
hello.+?friend匹配,结果就是命中第一个friend就停止的hellomyfriend
那么问题来了: .*?又表示什么意思呢?
2.前瞻: 字符串后边 包括/不包括 某个单词/字母
这里之所以 配合 .+? 进行查询条件,是因为括号中的条件,和前面的字符串并不是相邻的,中间隔着至少1个字符及以上
2-1.包含某单词: start(?=.+?hello)
查找start单词,并且后边要包括hello这个单词
实际应用:
定位日志中,Instagram的category是call的:
instagram(?=.+?category=call)
2-2.不包含某单词: start(?!.+?hello)
参考资料: 正则表达式:不包含某个单词
查找start单词,但是后边不包括hello这个单词
实际应用:
定位日志中,Instagram的category≠call的:
instagram(?!.+?category=call)
注意:输出结果只是括号前的东西,括号里的只是if条件。