实际开发中经常会遇到这样的情况,需要在一组字符串中取出指定的字符,例如:
取出如下一段代码里和html标签
<div><h2>title</h2><p>content</p></div>
理想的结果是:['div', 'h2', 'p']
经观察目前字符串的特点是:前置有:<、后置有:>,这个时候就能用到先行断言和后行断言,直接给出代码:
'<div><h2>title</h2><p>content</p></div>'.match(/(?<=\<)[a-z0-9]+(?=\>)/g)
由于 后行断言 ES2018 才引入,所以实际应用中可能会需到问题,这个另外的话题,暂不提。
下面用另一个例子,再系统说一下先行断言和后行断言
有如下字符串:
我爱你 我爱 爱 爱你
如果要取出爱字,要求这个爱字后面有你,这个时候就要这么写,这就是 先行断言:
'我爱你 我爱 爱 爱你'.match(/爱(?=你)/g) // ["爱", "爱"]
如果要求爱字后面没有你,那自然也有先行否定断言:
'我爱你 我爱 爱 爱你'.match(/爱(?!你)/g) // ["爱", "爱"] ,因为匹配相同...
这个时候,如果要求爱字后面有你,前面还要有我,那就要用到后行断言了,如下:
'我爱你 我爱 爱 爱你'.match(/(?<=我)爱(?=你)/g) // ["爱"]
最后,如果要求爱字前面没有我,后面也没有我,那就要用到先行否定断言和后行否定断言,如下:
'我爱你 我爱 爱 爱你'.match(/(?<!我)爱(?!你)/g) // ["爱"]
后最要说,正则表达式真是太灵活了... 加一个 软老师传送门