正则表达式:断言

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

在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
相关推荐
柒壹漆几秒前
用Python制作一个USB Hid设备数据收发测试工具
开发语言·git·python
LXS_3572 分钟前
Day 16 C++提高之模板
开发语言·c++·笔记·学习方法
盒马盒马5 分钟前
Rust:内部可变性 & 型变
开发语言·后端·rust
沐知全栈开发5 分钟前
XSLT `<value-of>` 元素详解
开发语言
东哥很忙XH11 分钟前
python使用PyQt5开发桌面端串口通信
开发语言·驱动开发·python·qt
૮・ﻌ・15 分钟前
Vue3:组合式API、Vue3.3新特性、Pinia
前端·javascript·vue3
前端不太难15 分钟前
RN + TypeScript 项目越写越乱?如何规范架构?
前端·javascript·typescript
手揽回忆怎么睡16 分钟前
Java集成whisper.cpp
java·开发语言·whisper
wjs202418 分钟前
R 基础语法
开发语言
JS_GGbond22 分钟前
用美食来理解JavaScript面向对象编程
开发语言·javascript·美食