正则表达式的负先行
Negative Lookahead for Regex
有什么区别:
^(?!.*baa)[abc]*$
和
^(?!baa)[abc]*$
那个.*
的作用是什么?我知道这意味着任何字符 0 次或多次,但为什么第二个字符捕获应该丢弃的 cccaabaa
之类的字符串?
它们的区别是:
^(?!.*baa)
要求 baa
不在输入 任何地方
^(?!baa)
要求 baa
不在输入 的 开始
.*
允许开始 ^
和 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"
有什么区别:
^(?!.*baa)[abc]*$
和
^(?!baa)[abc]*$
那个.*
的作用是什么?我知道这意味着任何字符 0 次或多次,但为什么第二个字符捕获应该丢弃的 cccaabaa
之类的字符串?
它们的区别是:
^(?!.*baa)
要求baa
不在输入 任何地方^(?!baa)
要求baa
不在输入 的 开始
.*
允许开始 ^
和 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 ofa
,b
andc
^(?!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"