表达式 | 名称 | 描述 |
---|---|---|
?=exp | 正向前瞻 | 零宽度,断言出现的位置后面能匹配exp,则匹配成功,匹配不占据匹配长度,非捕获 |
?!exp | 负向前瞻 | 零宽度,断言出现的位置后面不能匹配exp,则匹配成功,匹配不占据匹配长度,非捕获 |
?:exp | 正向前瞻 | 非捕获性分组,断言出现位置后面匹配exp,占据查询的匹配长度 |
零宽度:表示只匹配位置,不匹配字符
栗子一:
str.replace( /\B(?=(?:\d{3})+$)/g, ',' );
分析:
\B 或者 \b 匹配到的是一个位置,没有字符,
\B:表示非单词边界
\b:表示单词边界
之后了解?= ?:之间的差别
?=exp 表示零宽度正预测先行断言,简单来说,就是在断言出现的位置后面必须匹配exp,否则匹配失败,当匹配成功,也不会占据查询长度(也就是下一个查询的index与exp匹配成功的长度无关)
?:exp 表示非捕获性分组,若匹配成功,不会存在匹配成功的分组当中,但是会占据查询长度。
所以这一个正则的匹配思路为:
栗子:
'1234567'.replace(/\B(?=(?:\d{3})+$)/g, ';') // 1,234,567
先匹配第一个非单词边界(1和2之间),然后?=预测后面的内容为\d{3}三个连续的数字,+做循环,不断检测三个连续数字,(234 567),当数字匹配完之后,开始检查是否为字符串结尾,若为结尾,则匹配成功;接着从第二个单词边界开始(2和3之间),……
最后查询结束符合匹配的就在1和2之间 4和5之间
栗子二:
/*将字符串中除了div和p标签之外替换成p*/
var input = '<div class="beautiful">,<p class="provocative">,<span class="sexy">,<h1 class="attractive" id="header">,</h1>,</span>,</p>,</div>';
var output = input.replace(/<(\/?)(?!div|p|\/p|\/div)(?:[a-z0-9]+)(.*?)>/g, '<$1p$2>');
console.log(input);
console.log(output);
//<div class="beautiful">,<p class="provocative">,<span class="sexy">,<h1 class="attractive" id="header">,</h1>,</span>,</p>,</div>
//<div class="beautiful">,<p class="provocative">,<p class="sexy">,<p class="attractive" id="header">,</p>,</p>,</p>,</div>
分析:
以<开始,可匹配/或者不匹配(有?,?表示0或以上),后面不为div或p或/p或/div(有?! 表示负向前瞻),后面为多个数字或者小写字母,但是不捕获,占据位置,最后可有可无的多个任意字符
网友评论