http://stackoverflow.com/questions/1749437/regular-expression-negative-lookahead
A negative lookahead says, at this position, the following regex can not match.
Let's take a simplified example:
a(?!b(?!c))
a Match: (?!b) succeeds
ac Match: (?!b) succeeds
ab No match: (?!b(?!c)) fails
abe No match: (?!b(?!c)) fails
abc Match: (?!b(?!c)) succeeds
The last example is a double negation: it allows a b followed by c. The nested negative lookahead becomes a positive lookahead: the c should be present.
In each example, only the a is matched. The lookahead is only a condition, and does not add to the matched text.
如果写了这样的正则表达式 a(?!b)
就表示匹配所有后面没有b紧跟着的a.
也就是说"ab aa ac ad"
就会匹配到
(a)a
a(a)
(a)c
(a)d
这里只有ab的a是匹配不到的, 因为后面紧跟着b
分享到:
相关推荐
环视分为前瞻断言(Positive Lookahead)和后瞻断言(Positive Lookbehind),以及它们的否定形式:负前瞻断言(Negative Lookahead)和负后瞻断言(Negative Lookbehind)。 1. 前瞻断言(Positive Lookahead):...
当我们需要匹配不包含某些特定关键词的字符串时,我们需要使用否定前瞻(Negative Lookahead)或者否定后瞻(Negative Lookbehind)。在PHP中,这两种前瞻后瞻都是以 `(?!...)` 和 `(?<!...)` 的形式出现。 首先,...
pattern)`),以及前瞻否定断言(Negative lookahead `(?!pattern)`)和后顾否定断言(Positive lookbehind `(?)`)。它们不消耗字符,仅检查是否存在匹配的模式。 8. **反向引用(Backreferences)**:在分组中,...
顺序肯定环视(Lookahead)和顺序否定环视(Negative lookahead)关注于当前位置之后的文本,而逆序肯定环视(Lookbehind)和逆序否定环视(Negative lookbehind)则关注于当前位置之前的文本。 顺序肯定环视((?=...
在实际应用中,我们经常需要处理复杂的正则表达式,如捕获组、预查(lookahead 和 lookbehind)、否定预查(negative lookahead 和 negative lookbehind),以及非贪婪匹配。这些高级特性可以实现更精细的文本匹配...
- 预查(Positive Lookahead)与反预查(Negative Lookahead):允许在不包含它们的情况下检查是否匹配某个模式。 - 后顾(Positive Lookbehind)与反后顾(Negative Lookbehind):检查某个位置后面是否满足特定...
...)` 分别表示零宽否定预查(negative lookahead)和零宽肯定预查(positive lookahead)。它们不会消耗文本,只检查当前位置是否满足条件。例如,检查字符串是否以特定字符开头但不包括该字符: ```javascript ...
- **向后查看**(Negative Lookahead)`(?!pattern)` 确保匹配的位置后面不跟随特定模式。 - **零宽断言**(Zero-width assertion)是指这些结构不会消耗输入字符串的任何字符,它们仅用于检查某个条件是否满足。 ...
其次,前视取反(Negative Lookahead)以`(?!...)`的形式出现,它确保匹配的字符串后面不跟着特定的模式。假设我们要找出所有不以"not"开头的单词,可以使用以下正则表达式: ```python text = "I am not happy, ...
=...)`和**负向前瞻(Negative Lookahead)**`(?!=...)`用于检查当前位置之后是否满足某种模式,但不实际消耗这些字符。 - **正向回溯(Positive Lookbehind)**`(?)`和**负向回溯(Negative Lookbehind)**`(?<!.....
正向预查(Positive lookahead)和反向预查(Negative lookahead)允许我们在不实际匹配的情况下检查字符串是否包含特定模式。它们分别用`(?=pattern)`和`(?!pattern)`表示,对于确保某些条件满足或排除某些条件非常...
7. **预查(Positive Lookahead and Negative Lookahead)**:(?:?=...)和(?:?!...)允许我们在匹配时检查某个条件,但不包含在最终匹配结果中。 8. **正向后顾查找(Positive Lookbehind)和负向后顾查找(Negative...
- **负向先行断言(Negative Lookahead)**:`(?!...)`,确保当前位置之后的文本不满足指定模式。 - **正向后行断言(Positive Lookbehind)**:`(?)`,确保当前位置之前的文本满足指定模式。 - **负向后行断言...
2. 非贪婪零宽断言:"negative lookahead" "(?!pattern)" 和 "negative lookbehind" "(?<!pattern)",用于排除匹配。 八、模式修饰符 1. i:使匹配对大小写不敏感。 2. g:全局匹配,查找字符串中所有匹配项,而不...
=...)`)和预查否定(Negative Lookahead `(?!...)`):确保某个模式后面或前面跟随另一个模式,但不包含在最终匹配的文本中。 - 后顾(Positive Lookbehind `(?)`)和后顾否定(Negative Lookbehind `(?<!...)`)...
2. **否定预查(Negative lookahead)**:`(?!...)`确保匹配的字符串后面不跟着特定的模式。 3. **后顾反向引用(Backreference)**:`\数字`用于引用前面分组捕获的内容,如`\1`代表第一个分组的内容。 在Java中,...
...)是负向预查(negative lookahead),确保后面不跟特定模式。这在某些情况下能避免不必要的回溯。 7. **正向与负向字符集**:[^abc]表示匹配除'a'、'b'、'c'之外的任何字符,这是负向字符集的使用。 8. **模式...
- **后顾断言(Negative lookahead)**:如"ab(?!c)"匹配"ab",但不能在后面跟着"c"。 7. **预查否定(Positive and Negative Lookbehind)** - **正向预查断言(Positive lookbehind)**:如"(?)c"匹配"c",但必须在...