当前位置: 首页 > Web前端 > JavaScript

Javascript正则高级用法

时间:2023-03-26 21:43:57 JavaScript

先简单看下一些常用的基本标识符^匹配一个输入或一行的开头,/^a///匹配“一个A”,而不是“一个a”$匹配一个输入或一行/a$///的结尾匹配“Ana”,但不匹配“anA”*匹配前面的元字符0次或多次/ba*///匹配b,ba,baa,baaa,...+匹配前一个元字符1次或更多次/ba+///匹配ba,baa,baaa,...?匹配前一个元字符0或1次/ba?///匹配b,ba(x)//匹配x将x存储在名为$1...$9x|y的变量中//匹配x或y{n}//准确匹配n次{n,}//匹配n次以上{n,m}//匹配n-m次[xyz]//字符集,匹配这个集合中的任意字符(或元字符),匹配x,y,z[^xyz]//不匹配此集合中的任何字符正则表达式(RegularExpression)实际上是一个通过字符串模式匹配实现搜索和替换功能的工具。它起源于20世纪50年代科学家在数学领域所做的一些研究工作,后来被引入计算机领域。我们从它的名字就可以知道,它是一个用来描述规则的表达式。而且它的底层原理也很简单,就是利用状态机的思想来进行模式匹配。这里就不细说了,常用的方法属性,文档mdn都有,不要纠结,直入正题。Sub-expression子表达式(Reg)具有独立的匹配功能,将独立的匹配结果保存为一个独立的单元,可以使用*+?{n,m}/(ab)?c)///等量词进行匹配c或abc作为子模式可以独立处理,保留匹配结果的子串,可以通过RegExp访问$1,...$nvarre=/(\w+)\s(\w+)/;varstr="JohnSmith";varnewstr=str.replace(re,"$2,$1");console.log(newstr);//Smith和John下面的RegExp属性不是w3c标准,但是大部分浏览器都支持RegExp属性来描述$n的第n个子表达式只有1-9个$&最后匹配的字符串,RegExp.lastMatch别名$'最新匹配的右子串,RegExp.rightContextalias$`最新匹配的左子串,RegExp.leftContextAlias$+匹配的最后一个子串,RegExp.lastParenalias$_匹配成功的原始字符串,RegExp.inputalias对应参数变量名描述$n在replace函数中访问正则结果$n插入第n个子表达式匹配字符串,只有1-99$&插入匹配子串$'插入当前匹配子串右边的内容$`insert当前匹配子串$左边的内容匹配[Name]命名子表达式String反向引用(backreference),模式的后半部分引用已经被前面的子表达式匹配的子串通过反斜杠\加上数字。数字表示正则表达式中子表达式的顺序。例如:\1指的是第一个子表达式的匹配结果是匹配结果不是匹配模式vars="

title

text

";varr=/(<\/?\w+>).*\1/g;//等同于/(<\/?\w+>).*(

|

)/g//加上(<\/?\w+>)匹配结果===(

|

)匹配结果vara=s.match(r);//返回数组["

title

","

text

"]子表达式高级模式非捕获模式,匹配结果不保留/(?:\w+)\s(\w+)///?:标识非捕获//$1是从第二个子表达式namedcapture计算出来的,这个用的比较少varre=/(?\w+)\s(\w+)/;console.log("JohnSmith".match(re));//(?x)//匹配结果保存在匹配项的groups属性中。断言用于限制正则匹配的边界。其实^、&、\b、\B也是断言。^对应字符串开头&字符串结尾\b词边界\B非词边界这里主要先说说其他四种谓词断言,/x(?=y)/y匹配x抢占否定assertionwhenfollowedbyx,/x(?!y)/y不匹配x之后的断言whenitfollowedbyx,/(?<=y)x/y匹配x之后的否定断言whenitfollowedbyx,/(?["123","1234","12345","12345"]惰性模式添加一个“?”在修饰匹配次数的特殊符号之后,让匹配次数不定的表达式尽量少匹配,让能匹配或不匹配的表达式,尽可能“不匹配”varregex=/\d{2,5}?/g;varstring="123123412345123456";console.log(string.match(regex));//=>["12","12","34","12","34","12","34","56"]where/\d{2,5}?/表示虽然2到5次可以,但是当2次足够时,独占mode不会往下匹配(js不支持)。如果在表达式后添加一个加号(+),它将启用独占模式。和贪心模式一样,独占模式会匹配最长的。但是在独占模式下,正则表达式会尽可能匹配字符串,如果匹配不成功,则结束匹配,不回溯。正则性能正则引擎主要有两种类型:一种是DFA(确定性有限自动机),另一种是NFA(不确定性有限自动机)。NFA对应正则表达式为主的匹配,DFA对应文本为主的匹配。DFA从匹配文本开始,从左到右,每个字符不会匹配两次,它的时间复杂度是多项式的,所以一般来说比较快,但是支持的feature少,不支持captureGroups,各种引用等;NFA从正则表达式开始,不断读入字符,尝试匹配当前正则,不匹配则吐出字符重试,通常速度比较慢,最优时间复杂度为多项式,在最坏的情况下。NFA支持的特性更多,所以在大多数编程场景(包括java、js),我们面对的都是NFA。吐出字符并再次尝试是回溯。正则表达式回溯法原理