3.3 (?=p) 和 (?!p)
(?=p)其中p是一个子模式,即 p前面的位置 (该位置后面的字符要匹配p)
比如:(?=e),表示的是e字符前面的位置;
var result = "hello".replace(/(?=l)/g, '#'); console.log(result); // "he#l#lo"
而(?!p)就是(?=p)的反面意思
var result = "hello".replace(/(?!l)/g, '#'); console.log(result); // "#h#ell#o#"
二者的学名分别是 positive lookahead 和 negative lookahead。
中文翻译分别是 正向先行断言 和 负向先行断言 。
ES5 之后的版本,会支持 positive lookbehind 和 negative lookbehind。
具体是 (?<=p) 和 (?<!p)。
四、位置特性
对于位置的理解,我们可以累计额成空字符""。
比如"hello"字符串等价于如下形式:
"hello" == "" + "h" + "" + "e" + "" + "l" + "" + "l" + "" + "o" + "";
也等价于
"hello" == "" + "" + "hello"
因此,把 /^hello$/ 写成 /^^hello$$$/,是没有任何问题的:
var result = /^^hello$$$/.test("hello"); console.log(result); // true
也就是说,字符之间的位置,可以写成多个。
注:把 位置 理解 空字符 ,是对位置非常有效的理解方式
五、相关案例
5.1不匹配任何东西的正则
/.^/
正则要求 只有一个字符,但是该字符后面是开头 ,而这样的字符串是不存在的。
5.2数字的千分位分隔符表示法
比如吧12345678,变成12,345,678。
分析:那就是需要把相应的位置替换成","
5.2.1弄出来最后一个逗号
正则:/(?=\d{3}$)/
var result = "12345678".replace(/(?=\d{3}$)/g, ',')console.log(result); // 12345,678
其中(?=\d{3}$)匹配\d{3}$前面的位置。而\d{3}$匹配的是目标字符串最后那3为数字。
5.2.2弄出来多有逗号
因为逗号的出现的位置,要求后边3个数字一组,也就是\d{3}至少出现1次。
可以使用量词 + :
var result = "12345678".replace(/(?=(\d{3})+$)/g, ',')console.log(result); // 12,345,678
5.2.3匹配其余案例
写完正则后,是需要举个别案例来验证的,就会发现问题:
var result = "123456789".replace(/(?=(\d{3})+$)/g, ',')console.log(result); // ,123,456,789
上面的正则,仅仅是表示把从结尾向前数,一旦是3的倍数买酒吧前面的位置替换为逗号。
还需要要求:匹配的这个位置不能是开头。
我们知道开头的匹配是使用^,但是不是开头怎么整?
使用(?!^)