正则表达式:断言

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

在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
相关推荐
Yhame.4 小时前
深入理解 Java 中的 ArrayList 和 List:泛型与动态数组
java·开发语言
mazo_command5 小时前
【MATLAB课设五子棋教程】(附源码)
开发语言·matlab
IT猿手5 小时前
多目标应用(一):多目标麋鹿优化算法(MOEHO)求解10个工程应用,提供完整MATLAB代码
开发语言·人工智能·算法·机器学习·matlab
青春男大5 小时前
java栈--数据结构
java·开发语言·数据结构·学习·eclipse
88号技师5 小时前
几款性能优秀的差分进化算法DE(SaDE、JADE,SHADE,LSHADE、LSHADE_SPACMA、LSHADE_EpSin)-附Matlab免费代码
开发语言·人工智能·算法·matlab·优化算法
Zer0_on6 小时前
数据结构栈和队列
c语言·开发语言·数据结构
一只小bit6 小时前
数据结构之栈,队列,树
c语言·开发语言·数据结构·c++
问道飞鱼6 小时前
【知识科普】认识正则表达式
数据库·mysql·正则表达式
一个没有本领的人6 小时前
win11+matlab2021a配置C-COT
c语言·开发语言·matlab·目标跟踪
anyup_前端梦工厂6 小时前
初始 ShellJS:一个 Node.js 命令行工具集合
前端·javascript·node.js