Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Regex lookahead, lookbehind and atomic groups

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?

(?!) - negative lookahead (?=) - positive lookahead (?<=) - positive lookbehind (?<!) - negative lookbehind  (?>) - atomic group 
like image 577
Spidfire Avatar asked Jun 04 '10 10:06

Spidfire


People also ask

What is lookahead and Lookbehind in regex?

Lookahead allows to add a condition for “what follows”. Lookbehind is similar, but it looks behind. That is, it allows to match a pattern only if there's something before it.

Can I use Lookbehind regex?

The good news is that you can use lookbehind anywhere in the regex, not only at the start.

What is atomic group regex?

An atomic group is a group that, when the regex engine exits from it, automatically throws away all backtracking positions remembered by any tokens inside the group. Atomic groups are non-capturing.

What is Lookbehind?

Unlike look-ahead, look-behind is used when the pattern appears before a desired match. You're “looking behind” to see if a certain string of text has the desired pattern behind it. If it does, then that string of text is a match.


1 Answers

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:

    1. match its 1st alternative foo, then fail as s does not immediately follow in foots, and backtrack to its 2nd alternative;
    2. 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
like image 138
skyfoot Avatar answered Sep 22 '22 13:09

skyfoot