跳转到主要内容
模块 6 · 第 3 课(共 4)课程中的23/32~12 min
模块课程(3/4)

回顾:`(?<=...)``(?<!...)`

后视是前视的镜像:它们看起来之前 当前位置,仍然为零宽度。

  • (?<=...) -- 正向后查找:模式必须位于前面。
  • (?<!...) -- 负向后查找:模式不得位于前面。
Code
Pattern: (?<=\$)\d+
Sample:  Costo $100, sconto -25, totale $75.
                ^^^                  ^^

$ 不在匹配中,但用作条件:仅限数字 前面是美元符号匹配。

负向回顾

Code
Pattern: (?<!\w)\d+
Sample:  Codice abc123 e numero 456.
                              ^^^

(?<!\w) 要求数字之前没有单词字符: abc123 被排除(在 123 之前有 c,一个 \w), 456 匹配(在 456 之前) 有一个空格)。

与非捕获组的主要区别

Code
\\$\\d+         matches "$100": the match includes the dollar sign.
(?<=\\$)\\d+    matches "100":  the match contains ONLY the digits.

如果需要提取不带前缀的“干净”值,lookbehind 是正确的选择。

JavaScript 中的后向兼容性

正的 (?<=...) 和负的 (?<!...) 后向检查当前位置之前的内容。在JavaScript中,从ES2018开始支持它们;在旧版浏览器或旧版 Node.js 引擎中,它们会导致语法编译错误。

尝试一下

锻炼#regex.m6.l3.e1
尝试:0加载中...

仅从文本中的价格中提取数字金额(不带 $ 符号)。

正在加载编辑器...
显示提示

将 \\$ 移动到正向后查找 (?<=\\$) 内:位置条件,不是匹配的一部分。

3 次尝试后可用的解决方案

复习练习

锻炼#regex.m6.l3.e2
尝试:0加载中...

查找前面没有字母或数字的每个数字序列(即“孤立的”数字,而不是像“abc123”这样的代码部分)。

正在加载编辑器...
显示提示

使用负向后查找 (?<!\\w) 来排除前面有字母或数字的情况。

3 次尝试后可用的解决方案

额外的挑战

锻炼#regex.m6.l3.e3
尝试:0加载中...

Find only the digits of negative numbers (digits preceded by the `-` sign), excluding the minus sign from the match.

正在加载编辑器...
显示提示

将减号 - 移到正向后查找 (?<=-) 内。

3 次尝试后可用的解决方案