JavaScript正则表达式迷你书之贪婪模式-学习笔记
贪婪模式:
在使用修饰匹配次数的特殊符号时,有几种表示方法可以使同一个表达式能够匹配不同的次数,比如:"{m,n}","{m,}","?","*","+",具体匹配的次数随被匹配的字符串而定。这种重复匹配不定次数的表达式在匹配过程中,总是尽可能多的匹配
非贪婪模式:
在修饰匹配次数的特殊符号后再加上一个"?"号,则可以使匹配次数不定的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的"不匹配"。这种匹配原则叫作"非贪婪"模式,也叫作"勉强"模式。如果少匹配就会导致整个表达式匹配失败的时候,与贪婪模式类似,非贪婪模式会最小限度的再匹配一些,以使整个表达式匹配成功。
varregex=/\d{2,5}/g; varstring="123123412345123456"; console.log(string.match(regex)); //=>["123","1234","12345","12345"]
其中正则/d{2,5}/,表示数字连续出现2到5次。会匹配2位、3位、4位、5位连续数字。但是其是贪婪的,它会尽可能多的匹配。你能给我6个,我就要5个。你能给我3个,我就要3个。反正只要在能力范围内,越多越好。
横向模糊匹配
横向模糊指的是,一个正则可匹配的字符串的长度不是固定的,可以是多种情况的。其实现的方式是使用量词。譬如{m,n},表示连续出现最少m次,最多n次。比如正则/ab{2,5}c/表示匹配这样一个字符串:第一个字符是"a",接下来是2到5个字符"b",最后是字符"c"。
varregex=/ab{2,5}c/g; varstring="abcabbcabbbcabbbbcabbbbbcabbbbbbc"; console.log(string.match(regex)); //=>["abbc","abbbc","abbbbc","abbbbbc"]
纵向模糊匹配
纵向模糊指的是,一个正则匹配的字符串,具体到某一位字符时,它可以不是某个确定的字符,可以有多种可能。其实现的方式是使用字符组。
譬如[abc],表示该字符是可以字符"a"、"b"、"c"中的任何一个。比如/a[123]b/可以匹配如下三种字符串:"a1b"、"a2b"、"a3b"。
varregex=/\d{2,5}?/g; varstring="123123412345123456"; console.log(string.match(regex)); //=>["12","12","34","12","34","12","34","56"] 其中/\d{2,5}?/表示,虽然2到5次都行,当2个就够的时候,就不再往
多选分支
一个模式可以实现横向和纵向模糊匹配。而多选分支可以支持多个子模式任选其一。具体形式如下:(p1|p2|p3),其中p1、p2和p3是子模式,用|(管道符)分隔,表示其中任何之一。例如要匹配字符串"good"和"nice"可以使用/good|nice/。
varregex=/good|nice/g; varstring="goodidea,nicetry."; console.log(string.match(regex)); //=>["good","nice"]
但有个事实我们应该注意,比如我用/good|goodbye/,去匹配"goodbye"字符串时,结果是"good"
varregex=/good|goodbye/g; varstring="goodbye"; console.log(string.match(regex)); //=>["good"]
而把正则改成/goodbye|good/,结果是:
varregex=/goodbye|good/g; varstring="goodbye"; console.log(string.match(regex)); //=>["goodbye"]
也就是说,分支结构也是惰性的,即当前面的匹配上了,后面的就不再尝试了。
反向引用
比如要写一个正则支持匹配如下三种格式
2020-02-25
2020/02/25
2020.02.25
varregex=/\d{4}(-|\/|.)\d{2}(-|\/|.)\d{2}/; varstring1="2020-06-12"; varstring2="2020/06/12"; varstring3="2020.06.12"; varstring4="2020-02/12"; console.log(regex.test(string1));//true console.log(regex.test(string2));//true console.log(regex.test(string3));//true console.log(regex.test(string4));//true
其中/和.需要转义。虽然匹配了要求的情况,但也匹配"2016-06/12"这样的数据。
假设我们想要求分割符前后一致怎么办?此时需要使用反向引用:
varregex=/\d{4}(-|\/|.)\d{2}\1\d{2}/; varstring1="2020-06-12"; varstring2="2020/06/12"; varstring3="2020.06.12"; varstring4="2020-02/12"; console.log(regex.test(string1));//true console.log(regex.test(string2));//true console.log(regex.test(string3));//true console.log(regex.test(string4));//false
注意里面的1,表示的引用之前的那个分组(-|/|.)。不管它匹配到什么(比如-),1都匹配那个同样的具体某个字符。
我们知道了1的含义后,那么2和3的概念也就理解了,即分别指代第二个和第三个分组。
使用例子
字符串trim方法模拟
functiontrim(str){ returnstr.replace(/^\s+|\s+$/g,''); }
表示一个16进制字符,可以用字符组[0-9a-fA-F]。其中字符可以出现3或6次,需要是用量词和分支结构。使用分支结构时,需要注意顺序。正则如下
varregex=/#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})/g; varstring="#ffbbad#Fc01DF#FFF#ffE"; console.log(string.match(regex)); //=>["#ffbbad","#Fc01DF","#FFF","#ffE"]
上面内容就结束了,下面是其他网友的补充可以参考一下
varregExp=/8.*8/;
varstr="8google88google88google8";
上面例子,是贪婪模式,其实是用了重复(区间)匹配的正则表达式都为贪婪模式
前瞻模式是指某个匹配后面必须跟着某个字符串,例子如下
varregExp=/goo(?=gle)/;
varstrOne=google;
varstrTwo=googoo;
定语式返回匹配的是后面是带gle的;
捕获性分组和非捕获性分组:例子如下:
varregExp=/(google)\s(2020)/;
varstr="google2020";
返回的是一组数组[google2020,google,2020]
varregExp=/(google)\s(?:2020)/;
varstr="google2020"
返回的数组[google2020,google]
以上是看到一个微博记录以便以后学习
JavaScript正则表达式迷你书大家可以看一下,分类很细。
以上就是JavaScript正则表达式迷你书之贪婪模式-学习笔记的详细内容,更多关于正则表达式迷你书的资料请关注毛票票其它相关文章!