继续讲下一般人(这里的一般人指的是一般不写正则的人)不经常用的功能:
1、忽略优先量词
包括:*?、 ?、??、{num, num}? 。这几类和后面没有加?的量词的区别就是:前者会匹配尽可能少的内容,只要满足下限,匹配就能成功;而后者反之(简单点说就是非吃货和吃货的区别)。
2、非捕获型括号(?:…) 这个是什么意思呢?意思是只分组不捕获。 好处: 1>避免了不必要的捕获操作,提高了匹配效率。 2>根据情况选择合适的括号能够叫逻辑更清晰,读者能清楚理解需要捕获的内容,而不用挨个数括号算作者到底想捕谁。 坏处:写法看着不够美观,增加了阅读难度,这个难度因人而异。
3、反向引用 直接上代码(匹配html标签),顺便复习下刚才讲的非捕获。
4、环视(lookaround) 什么叫环视呢?这个解释起来比较麻烦(TC:麻烦到只可意会不能言表,靠,尼玛坑爹呢!好了,不开玩笑了),我们举个例子讲。 例如:1234567890,我想从右到左,每3个加一个逗号,变为1,234,567,890。正则表达式怎么写? 逗号应该加在“左边有数字,右边数字的个数正好是3的倍数的位置”,但是一般正则表达式都是从左向右工作的,这时就要用到“环视”了。 环视结构不匹配任何字符,只匹配文本中的特定位置,下面是四种类型的环视:
类型 | 正则写法 | 匹配成功的条件 | js支持程度 |
---|---|---|---|
肯定逆序环视 | (?<=…) | 子表达式能够匹配左侧文本 | 不支持 |
否定逆序环视 | (?<!…) | 子表达式不能匹配左侧文本 | 不支持 |
肯定顺序环视 | (?=…) | 子表达式能够匹配右侧文本 | 支持 |
否定顺序环视 | (?!…) | 子表达式不能匹配右侧文本 | 支持 |
有了环视,刚才我们的例子,就很好处理了,答案如下:
替换逗号步骤我没写,只是把需要在后面加逗号的数字都匹配出来了。
5、元字符和字符组的一些小破事 1、元字符的规定在字符组内外是有差别。 例如[*]的*就不再是元字符了;而[-]的-还是元字符;^在[]就不是匹配开头了,而是取反的意思(这里就不一一列出了,主要是提个醒,大家用到时注意点。为什么不一一列出,你这个懒鬼!回答正确,加10分)。 2、在多数系统中,使用范围表示法而不是列出范围内的所有字符并不会影响执行速度(例如:[0-9]与[0123456789]是一样的。)相反,如果某些实现方法没有优化好的话,还会是范围表示法会快一些。
扫码下方二维码,
随时关注更多前端干货文章!
▼
微信:IMWebTech