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

负向前瞻:`(?!...)`

负向预测 (?!...) 是正向预测的黑暗姐妹: 它要求给定的模式不遵循当前位置。它是 仍然零宽度:不消耗任何字符。

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

只有 75 匹配,因为它是唯一后面不跟的数字序列 euro。数字 100 和 25 后跟 euro,并且是 排除。

典型的负前瞻模式

  • ^(?!.*errore).*$ -- 不包含单词“errore”的行。
  • \b(?!the\b)\w+\b -- 不是 the 的单词。
  • (?!\s) -- 当前位置不是空格(可用作“修剪”)。
Code
Pattern: ^(?!.*\.bak$).*$
Sample (multiline with flag m):
  foto.jpg
  backup.bak
  documento.txt
Match: foto.jpg, documento.txt (excludes backup.bak)

通过负前瞻进行高级排除

负向先行 (?!...) 对于实现排除逻辑至关重要(例如验证密码是否不包含字典单词或标识符不是 class 或 function 等保留关键字)。

尝试一下

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

查找后面没有“欧元”的每个数字(因此不包括欧元价格)。

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

使用 (?! ...) 表示“不得遵循”。之后不得出现“euro”序列。

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

复习练习

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

查找至少包含 3 个字母的非“the”(不区分大小写)的每个单词。

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

在 \\b 之后打开一个否定前瞻 (?!the\\b),仅排除单词 the。

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

额外的挑战

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

Find all words consisting of letters that do not contain the letter `x` at any position (e.g. match `test`, `game` but not `extra`, `box`).

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

在单词边界 \\b 之后使用负前瞻 (?!\\w*x)。

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