12

after searching all over google for vsvim lookahead or lookbehind and on the wiki I can't seem to figure out how, or if it even supports lookahead or lookbehind (positives or negatives) and how to use them if so.

I've tried a few different syntaxes like \ze \@= (?<=let \w\+)( \(?<=let \w\+\)( that I've seen on vim answers but none of them seem to be working in vs vim for matching (nor substitution)

how do you do lookarounds in VsVim?

3
  • is this what you're looking for? link Commented Oct 13, 2016 at 0:54
  • have not tested, but yes that appears to be what I want Commented Oct 13, 2016 at 18:30
  • great, hopefully it works. Let me know. Commented Oct 13, 2016 at 21:12

3 Answers 3

4
+50

For any newcomers, I'll copy the contents of this link here for the future:

http://ssiaf.blogspot.ru/2009/07/negative-lookbehind-in-vim.html

/\(Start\)\@<!Date

This will match the 'Date' in 'EndDate' and 'YesterdaysDate' but will not match 'StartDate'

/Start\(Date\)\@!

will match the 'Start' in 'Starting but not in 'StartDate'

/Start\(Date\)\@=

will match the 'Start' in 'StartDate' but not in 'Starting

/\(Start\)\@<=Date

will match the 'Date' in 'StartDate' but not in 'EndDate' and 'YesterdaysDate'

Sign up to request clarification or add additional context in comments.

1 Comment

Probably works in Vim, but does not work in VsVim v.2.1.1.0 (when using Visual Studio 2015)
1

I want to expand on the excellent answer from @briansrls. I was looking for a more robust solution that could handle multi-word phrases, wildcards (for potential gaps between phrases) and alternatives (i.e., patterns):

Without wildcards:

  Positive Lookahead:  \(find this\)\(followed by this\|or that\)\@=
  Negative Lookahead:  \(find this\)\(not followed by this\|or that\)\@!
  Positive Lookbehind: \(preceded by this\|or that\)\@<=\(find this\)
  Negative Lookbehind: \(not preceded by this\|or that\)\@<!\(find this\)

With wildcards:

  Positive lookahead:  \(find this\)\(.*\(eventually followed by this\|or that\)\)\@=
  Negative lookahead:  \(find this\)\(.*\(not eventually followed by this:\|or that\)\)\@!
  Positive lookbehind: \(\(eventually preceded by this\|or that\).*\)\@<=\(find this\) 
  Negative lookbehind: \(\(not eventually preceded by this\|or that\).*\)\@<!\(find this\)

Note: For the wildcard versions, the extra parentheses are required so that the wildcard is excluded from the alternatives group, but is included in the lookaround group. This prevents duplicating the wildcards for every alternative. One could also use \zs & \ze to avoid the extra parentheses, but I find this method slightly more intuitive.

For more information:

Update: It appears that \zs & \ze are not yet implemented in VsVim as of this time.

Comments

0

I use vscode 1.86. I found VsVim (like vscode) uses standard regex syntax, rather than the VIM specific syntax. For example for lookaround (taking the reference from https://www.regular-expressions.info/lookaround.html):

  • (?<!Start)Date will match a "Date" not following "Start"
  • Start(?!Date) will match "Start" not followed by "Date"

The lookahead (or lookbehind) group is not a capturing group, even though it is surrounded by parentheses.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.