当涉及到正则表达式时,前瞻(lookahead)和后顾(lookbehind)是一种零宽度断言(zero-width assertions)。它们不直接匹配任何字符,而是在匹配过程中指定一个位置来检查前面或后面是否满足某些条件。

  1. 前瞻(Lookahead):
    • 正向前瞻(Positive Lookahead):(?=...)。它用于指定紧跟在当前位置后面的字符序列必须满足指定的模式。例如,a(?=b) 匹配 “ab” 中的 “a”,因为它后面紧跟着 “b”。
    • 负向前瞻(Negative Lookahead):(?!...)。它用于指定紧跟在当前位置后面的字符序列不能满足指定的模式。例如,a(?!b) 匹配 “ac” 中的 “a”,因为它后面不是 “b”。

示例:

  • 正向前瞻:匹配一个数字后面跟着一个字母的情况。
    • 正则表达式:\d(?=[a-zA-Z])
    • 匹配:”1a” 中的 “1”
    • 不匹配:”2b” 中的 “2”
  • 负向前瞻:匹配一个数字后面不跟着一个字母的情况。
    • 正则表达式:\d(?!=[a-zA-Z])
    • 匹配:”2” 中的 “2”
    • 不匹配:”1a” 中的 “1”
  1. 后顾(Lookbehind):
    • 正向后顾(Positive Lookbehind):(?<=...)。它用于指定当前位置之前的字符序列必须满足指定的模式。例如,(?<=a)b 匹配 “ab” 中的 “b”,因为它前面紧跟着 “a”。
    • 负向后顾(Negative Lookbehind):(?<!...)。它用于指定当前位置之前的字符序列不能满足指定的模式。例如,(?<!a)b 匹配 “cb” 中的 “b”,因为它前面不是 “a”。

示例:

  • 正向后顾:匹配一个字母前面跟着一个数字的情况。
    • 正则表达式:(?<=\d)[a-zA-Z]
    • 匹配:”1a” 中的 “a”
    • 不匹配:”b2” 中的 “b”
  • 负向后顾:匹配一个字母前面不跟着一个数字的情况。
    • 正则表达式:(?<![0-9])[a-zA-Z]
    • 匹配:”a” 中的 “a”
    • 不匹配:”1a” 中的 “a”