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

实践中环顾四周

让我们在现实场景中将所有四种形式的环顾四周放在一起。 当您需要执行以下操作时,环顾四周会大放异彩:

  1. 提取一个没有上下文的值 标识它。
  2. 根据多个独立条件验证字符串。
  3. 过滤满足某些条件但不满足其他条件的匹配。

密码验证

Code
Pattern: ^(?=.*[A-Z])(?=.*\d)(?=.*[^a-zA-Z\d]).{8,}$
Checks:
  - at least one uppercase     (?=.*[A-Z])
  - at least one digit         (?=.*\d)
  - at least one symbol        (?=.*[^a-zA-Z\d])
  - minimum length 8           .{8,}

每个前瞻检查一个条件,从头开始 (^)。他们是 全零宽度:引擎停留在位置 0,然后消耗 .{8,}$。

分隔符之间的提取

Code
Pattern: (?<=\().+?(?=\))
Sample:  Funzione foo(bar) e baz(qux, qix)
Match: "bar", "quux, qix" (without parentheses)

Lookbehind + Lookahead + 惰性量词:提取里面的内容 括号,但不包括它们。

结合前瞻和后瞻

一起使用lookahead和lookbehind可以隔离位于特定标签或格式内的字符串(例如提取两个标签之间的文本而不包括最终匹配中的标签)。这避免了后续的字符串清理操作。

尝试一下

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

从日志中提取每个“key=value”赋值的值:仅提取值(没有键,没有“=”)。值可能包含字母和数字。

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

将 `=` 移至后向查找 (?<==) 内:这样匹配项仅包含值。

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

复习练习

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

查找哪些单词至少有一个大写字母和至少一个数字(以任意顺序),并在文本中找到它们。

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

在开始处进行双重前瞻:(?=\\w*[A-Z])(?=\\w*\\d)。然后用 \\w+ 消耗该单词。

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

额外的挑战

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

Extract only numerical digits that are enclosed exactly between parentheses, e.g. extract `102` from `(102)` without capturing the parentheses.

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

Combine a positive lookbehind (?<=\( ) for the open parenthesis and a positive lookahead (?=\) ) for the closed one.

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