模块 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 次尝试后可用的解决方案