正则表达式:断言

在前面的文章《正则表达式:元字符》,提到了正则表达式的断言:

在JavaScript中,正则断言是一种正则表达式的高级功能,用于在匹配过程中进行条件判断。它允许你在不消耗字符的情况下,对字符串中的特定位置进行匹配。

注:"不消耗字符"的意思是,断言匹配的位置不会在字符串中占据字符位置,也就是说,匹配成功后,匹配位置之前和之后的字符仍然可以被其他模式匹配到。这样的断言称为零宽断言,因为它们不会消耗字符串中的字符。

正则断言分为前瞻断言和后顾断言。
前瞻断言又可以分为:肯定前瞻断言(正向断言)和否定前瞻断言(负向断言);
后顾断言又可以分为:肯定后顾断言(正向否定断言)和否定后顾断言(负向否定断言)

一、前瞻断言

前瞻:是指在匹配过程中,我们可以在当前位置向前查看,以确定是否满足某种条件。通过使用前瞻,我们可以对匹配的结果进行更精确的控制,从而实现更复杂的匹配需求。
正向前瞻:使用肯定的条件来匹配,即只有当某个模式的后面紧跟着满足指定条件的内容时,才认为匹配成功。应用举例:可以使用正向前瞻来匹配一个单词后面跟着某个特定字符的情况。
负向前瞻:则使用否定的条件来匹配,即只有当某个模式的后面不满足指定条件的内容时,才认为匹配成功。应用举例:可以使用负向前瞻来匹配一个单词后面不跟着某个特定字符的情况

(1)正向断言(Positive Lookahead):(?=...)

正向前瞻的语法是使用括号和问号来表示,即(?=pattern),其中pattern表示要查找的模式。当正向前瞻被使用时,它会在当前位置向前查找,如果满足指定的条件,则返回匹配成功,否则返回匹配失败。

正向前瞻用于匹配后面跟随特定模式的字符串位置,它不会消耗字符,只是检查后面的字符是否满足条件。

示例:邮件地址匹配

const emails = ['zhangsan@qq.com', 'lisi@qq.com', 'wangwu@qq.com'];

const usernameRegex = /\w+(?=@)/;

emails.forEach(email => {
  const match = email.match(usernameRegex);
  console.log(match[0]);
});

在这个例子中,我们使用了正向前瞻(?=@)来匹配@符号之前的内容。\w+表示匹配一个或多个字母、数字或下划线,(?=@)表示要求在当前位置向前查找,必须紧跟着@符号。

(2)负向断言(Negative Lookahead):(?!...)

负向前瞻的语法结构是 (?!pattern),它表示在当前位置向前查找,确保接下来的文本不匹配 pattern。如果匹配成功,则当前位置不会被视为匹配项,继续向后匹配。

负向断言用于匹配后面不跟随特定模式的字符串位置。同样,它不会消耗字符。

示例:匹配不以 “abc” 开头的字符串

const regex = /^(?!abc).*/;
console.log(regex.test("cde")); // true
console.log(regex.test("abcdef")); // false

二、后顾断言

后顾:是指在匹配过程中,我们可以在当前位置向后查看,以确定是否满足某种条件。通过使用后顾,我们可以对匹配的结果进行更精确的控制,从而实现更复杂的匹配需求。这个特性已经在ECMAScript 2018(ES9)正式发布了。
正向后顾:使用肯定的条件来匹配,即只有当某个模式的前面紧跟着满足指定条件的内容时,才认为匹配成功。应用举例:使用正向后顾来匹配一个特定字符前面跟着满足某种条件的内容。
负向后顾:使用否定的条件来匹配,即只有当某个模式的前面不满足指定条件的内容时,才认为匹配成功。应用举例:使用负向后顾来匹配一个特定字符前面不满足某种条件的内容。

(1)正向否定断言(Positive Lookbehind):(?<=...)

正向后顾语法结构是(?<=pattern),表示匹配位置前面的内容必须满足指定的模式。

正向否定断言用于匹配前面是特定模式的字符串位置。它不会消耗字符,只是检查前面的字符是否满足条件。注意,这个特性在ES2018之前是不可用的。

示例:匹配以数字开头的单词

const str = "每件价格100元";
const regex = /(?<=\b)\d+\b/g;
const matches = str.match(regex);
console.log(matches); // 输出: ["100"]

(2)负向否定断言(Negative Lookbehind):(?<!...)

负向后顾语法结构是(?<!pattern),表示匹配位置前面的内容不能满足指定的模式。

负向否定断言用于匹配前面不是特定模式的字符串位置。同样,它不会消耗字符。注意,这个特性在ES2018之前是不可用的。

示例:匹配不是以123开头的abc

const regex = /(?<!123)abc/g;;
console.log(regex.test("abc123")); // true
console.log(regex.test("123abc")); // false
  • 24
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓风伴月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值