正则表达式:断言

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

在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
相关推荐
wuhen_n2 分钟前
KeepAlive:组件缓存实现深度解析
前端·javascript·vue.js
wuhen_n4 分钟前
Vue Router与响应式系统的集成
前端·javascript·vue.js
FansUnion31 分钟前
用 AI 自动生成壁纸标题、描述和 SEO Slug
javascript
大雨还洅下44 分钟前
前端 JS: async, await; Generator
javascript
juejin_cn44 分钟前
[转][译] 从零开始构建 OpenClaw — 第三部分(元技能)
javascript
颜酱3 小时前
二叉树分解问题思路解题模式
javascript·后端·算法
炫饭第一名4 小时前
速通Canvas指北🦮——路径与形状篇
前端·javascript·程序员
无责任此方_修行中4 小时前
如何利用 pnpm 的安全控制功能防御 npm 供应链攻击
javascript·npm·node.js
进击的尘埃4 小时前
前端状态管理的本质:从 Vuex 到 Pinia,我们到底在管理什么?
javascript
码路飞4 小时前
GPT-5.3 Instant 终于学会好好说话了,顺手对比了下同天发布的 Gemini 3.1 Flash-Lite
java·javascript