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

正向前瞻:`(?=...)`

正向前瞻 (?=...) 是一个 零宽度 断言: 它检查特定模式是否遵循当前位置,但 ** 确实如此 不消耗**那些字符。

Code
Pattern: \d+(?= euro)
Sample:  Prezzo 100 euro, sconto 25 euro, totale 75 dollari.
                ^^^                 ^^

前瞻 (?= euro) 要求数字后跟 euro,但是 匹配仅包含数字。 75 dollari 不匹配(无 euro)。

为什么“零宽度”

将前瞻视为该位置的条件,而不是 比赛部分:

  • 比赛在前瞻之前停止。
  • “匹配之后”的位置是前瞻检查的文本的开始处。
  • 带有 g 标志的下一次匹配尝试将从那里恢复。

这使得它非常适合在没有上下文的情况下提取值:价格 没有货币、标点符号之前的单词等等。

前瞻功能和零宽度扫描

正向先行 (?=...) 保证指定的模式遵循当前点,但扫描从先行之前的位置恢复。这可以防止“消耗”后续匹配可能需要的文本部分。

尝试一下

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

仅提取欧元价格的数字(后跟“欧元”的数字序列)。比赛中没有货币。

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

将 ' euro' 移至前瞻 (?= euro) 内:该字符串不会成为匹配的一部分。

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

复习练习

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

查找紧跟冒号“:”的每个单词(但在匹配中不包括冒号)。

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

相同的逻辑:“:”不在匹配中,但它是一个位置条件。

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

额外的挑战

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

Find every word (e.g. function name) followed immediately by an open parenthesis `(`, excluding the parenthesis from the match.

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

将 \\((转义左括号)移至正向先行 (?=...) 内。

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