Skip to content

Instantly share code, notes, and snippets.

@kbbgl
Created May 11, 2020 16:21
Show Gist options
  • Save kbbgl/4b3ec7a367aa53f15e8240293590dbc9 to your computer and use it in GitHub Desktop.
Save kbbgl/4b3ec7a367aa53f15e8240293590dbc9 to your computer and use it in GitHub Desktop.
[lookaheads] #regex

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment