Regex lookahead, lookbehind and atomic groups

regex, regex-lookarounds

Solution

Examples

Given the string `foobarbarfoo`:

bar(?=bar)     finds the 1st bar ("bar" which has "bar" after it)
bar(?!bar)     finds the 2nd bar ("bar" which does not have "bar" after it)
(?<=foo)bar    finds the 1st bar ("bar" which has "foo" before it)
(?<!foo)bar    finds the 2nd bar ("bar" which does not have "foo" before it)

You can also combine them:

(?<=foo)bar(?=bar)    finds the 1st bar ("bar" with "foo" before it and "bar" after it)

Definitions

Look ahead positive `(?=)`

Find expression A where expression B follows:

A(?=B)

Look ahead negative `(?!)`

Find expression A where expression B does not follow:

A(?!B)

Look behind positive `(?<=)`

Find expression A where expression B precedes:

(?<=B)A

Look behind negative `(?<!)`

Find expression A where expression B does not precede:

(?<!B)A

Atomic groups `(?>)`

An atomic group exits a group and throws away alternative patterns after the first matched pattern inside the group (backtracking is disabled).

- `(?>foo|foot)s` applied to `foots` will match its 1st alternative `foo`, then fail as `s` does not immediately follow, and stop as backtracking is disabled

A non-atomic group will allow backtracking; if subsequent matching ahead fails, it will backtrack and use alternative patterns until a match for the entire expression is found or all possibilities are exhausted.

`(foo|foot)s` applied to `foots` will:

- match its 1st alternative `foo`, then fail as `s` does not immediately follow in `foots`, and backtrack to its 2nd alternative;

- match its 2nd alternative `foot`, then succeed as `s` immediately follows in `foots`, and stop.

Some resources

- http://www.regular-expressions.info/lookaround.html

- http://www.rexegg.com/regex-lookarounds.html

Online testers

- https://regex101.com

Problem

I found these things in my regex body but I haven't got a clue what I can use them for. Does somebody have examples so I can try to understand how they work? ``` (?=) - positive lookahead (?!) - negative lookahead (?<=) - positive lookbehind (?<!) - negative lookbehind (?>) - atomic group ```

Original source

Related problems