正则表达式中(?=p),(?!p),(?<=p),(?<!p)5分钟快速理解,掌握正则位置匹配

JS正则表达式-基础(三)

1.位置匹配

位置是相邻字符之间的位置,可以理解成空字符 “”。比如,下图中箭头所指的地方

image-20230205200127528

“hello” == “” + “h” + “” + “e” + “” + “l” + “” + “l” + “” + “o” + “”

如何匹配位置呢?

在 ES5 中,共有 6 个锚: ^、$、\b、\B、(?=p)、(?!p)

其中 (?=p)(?!p)

二者的学名分别是 positive lookaheadnegative lookahead

中文翻译分别是正向先行断言负向先行断言

ES5 之后的版本,会支持 positive lookbehindnegative lookbehind

具体是 (?<=p)(?<!P)


^、$解释

^(脱字符)匹配开头,在多行匹配中匹配行开头。

$(美元符号)匹配结尾,在多行匹配中匹配行结尾。


\b、\B解释

\b 是单词边界,具体就是 \w\W 之间的位置,也包括 \w^ 之间的位置,和 \w$ 之间的位置。

举个例子:

var result = "<html> title_01.html <html>".replace(/\b/g, '#');
console.log(result);
// => "<#html#> #title_01#.#html# <#html#>"

我们知道,\w 是字符组 [0-9a-zA-Z_] :的简写形式,即 \w 是字母数字或者下划线的中任何一个字 符。而 \W 是排除字符组 [^0-9a-zA-Z_] 的简写形式,即 \W 是 \w 以外的任何一个字符。

所以在两个交接处替换为了#


(?=p),(?!p),(?<=p),(?<!p)的解释

首先是(?=p),它匹配p之前的位置

举个例子:

var result = "xxxxpxxxx".replace(/(?=p)/g, '#');
console.log(result);
// => "xxxx#pxxxx"

可以看到,p之前的位置被#号所替换

(?!p)(?=p)的反面意思

再举个例子:

var result = "xxxxpxxxx".replace(/(?!p)/g, '#');
console.log(result);
// => "#x#x#x#xp#x#x#x#x#"

这里可以看到除了p之前的位置,其他位置都被 #号所替换

接下来就是(?<=p),(?<!p)

很好理解,这里(?<=p)其实就是(?=p)相反意思。

(?=p)是取p之前的那个空位嘛,(?<=p)就是取p之后的那个空位

举个例子:

var result = "xxxxpxxxx".replace(/(?<=p)/g, '#');
console.log(result);
// => "xxxxp#xxxx"

同理。(?<!p)其实就是(?!p)相反意思。

(?!p)是取除了p之前位置的所有空位嘛,(?<!p)就是取除了p之后位置的其他所有空位

举个例子:

var result = "xxxxpxxxx".replace(/(?<!p)/g, '#');
console.log(result);
// => "#x#x#x#x#px#x#x#x#"

2.位置的特性

之前不是说过,位置就是字符之间的空字符串嘛。

"hello" == "" + "h" + "" + "e" + "" + "l" + "" + "l" + "" + "o" + "";

也等价于:

"hello" == "" + "" + "hello"

因此,把 /^hello$/ 写成 /^^hello$$$/,是没有任何问题的:

也就是说字符之间的位置,可以写成多个。

3.作用与案例

那这些(?=p),(?!p),(?<=p),(?<!p)有什么作用呢?

首先是两个(?=p),(?!p)

数字的千位分隔符表示法:

比如把 “12345678”,变成 “12,345,678”。

var result = "12345678".replace(/(?!^)(?=\d{3}+$)/g, ',')
console.log(result);
// => "12,345,678"

这里的+号表示至少出现一次,不要理解成拼接


其次是(?<=p),(?<!p)

取两个匹配值之间的内容

比如我想提取出<title>tragedy<title>的字符

这时候该怎么办呢?

传统的提取方法

var reg = "/<title>(.*?)</title>/g"
// 输出:<title>tragedy</title>

但我只想要title标签里的内容,这时候就可以用到(?<=p),(?=p)

一个是之后,一个是之前。形成一个闭环

var reg = "/(?<=<title>)(.*?)(?=</title>)/g"
// 输出:tragedy

至于(?<!P)大家可以自由探索,通常是配合使用的

参考文档:JS正则表达式迷你书 第1版

想了解更多 ==> 个人博客:Couno’Blog

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值