正则表达式的负先行

Negative Lookahead for Regex

有什么区别:

^(?!.*baa)[abc]*$

^(?!baa)[abc]*$

那个.*的作用是什么?我知道这意味着任何字符 0 次或多次,但为什么第二个字符捕获应该丢弃的 cccaabaa 之类的字符串?

它们的区别是:

  1. ^(?!.*baa) 要求 baa 不在输入 任何地方
  2. ^(?!baa) 要求 baa 不在输入
  3. 开始

.* 允许开始 ^baa 之间的任何内容。

^(?!.*baa)[abc]*$ - Starts from current position(here beginning due to ^), consumes the whole string and then backtracks to find if there is no baa anywhere in string. Now the position from which match of lookahead started(here beginning) check whatever follows is combiantion of a, b and c

^(?!baa)[abc]*$ - Starts from current position(here beginning due to ^) to check what follows is not baa. baa can be anywhere but not in starting.

(?! ) 是一个否定的前瞻:它指定了一个无法匹配的组。

^(?!baa)[abc]*$ 中,您要查找的字符串不以 "baa" 开头,并且只有 b 或 c 中的字符:cccaabaa 匹配:它没有开始"baa".

^(?!.*baa)[abc]*$ 中,您要查找的字符串不以 baa 后面的任何内容开头,并且仅包含 b 或 c 中的字符:cccaabaa 不匹配,因为它开头"cccaa following by baa"