正则表达式:断言

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

在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
相关推荐
笃励13 分钟前
Java面试题二
java·开发语言·python
jyan_敬言22 分钟前
【Linux】Linux命令与操作详解(一)文件管理(文件命令)、用户与用户组管理(创建、删除用户/组)
linux·运维·服务器·c语言·开发语言·汇编·c++
FL162386312925 分钟前
[C#]C# winform部署yolov11-pose姿态估计onnx模型
开发语言·yolo·c#
笑非不退36 分钟前
C++ 异步编程 并发编程技术
开发语言·c++
儒雅的烤地瓜1 小时前
JS | JS中判断数组的6种方法,你知道几个?
javascript·instanceof·判断数组·数组方法·isarray·isprototypeof
道爷我悟了1 小时前
Vue入门-指令学习-v-on
javascript·vue.js·学习
27669582921 小时前
京东e卡滑块 分析
java·javascript·python·node.js·go·滑块·京东
爱写代码的刚子1 小时前
C++知识总结
java·开发语言·c++
martian6651 小时前
QT开发:基于Qt实现的交通信号灯模拟器:实现一个带有倒计时功能的图形界面应用
开发语言·qt
冷琴19961 小时前
基于java+springboot的酒店预定网站、酒店客房管理系统
java·开发语言·spring boot