Thanks very much for your detailed explanation. In fact, by pseudocode I think I can put my requirement like this:
1. Search for the first pair of "==" from the beginning location where the search starts. 2. Extract the contents in the pair of "==" as the first match result. 3. Disable/Invalidate/Remove the matched contents with its "==" surroundings. 4. Repeat from 1. until reaching the end of the search range. So, is it possible to do that by regular expression? I'm not very familiar with the concepts of greedy/non-greedy or zero-match (like the queer things of \@! or \@<= etc.) or . Will they help? On Wed, Oct 3, 2012 at 11:41 AM, Ben Fritz <[email protected]> wrote: > On Tuesday, October 2, 2012 9:38:20 PM UTC-5, Xell Liu wrote: >> Hi all, >> >> >> >> Suppose this text fragment: >> >> >> >> xxx==aaa==bbbccc==ddd==yyy >> >> >> >> How can I match the "aaa" and "ddd" between the pair of "==" without >> >> matching the bbbccc (or, of course, "xxx" or "yyy")? Apparently >> >> /==\zs[^=]\{-}\ze==/ fails. > > For me it matches exactly what you told it to: > > ==\zs : after two '=' characters... > [^=] : match ANY character which is not a '='... > \{-} : ANY number of times... > \ze== : until another pair of '=' characters. > > In your example, this matches aaa, bbbccc, and ddd. There is no reason I can > think of to expect otherwise. > >> However /==[^=]\{-}==/ does match the >> >> "aaa" and "ddd" WITH the pair of "==". I got lost here. >> >> > > I'm guessing you noticed that hitting 'n' after searching for this pattern > does not match the bbbccc in your example text. This actually surprised me a > little, but I think it happens because: > > You are searching for the "next" match. > The beginning of the ==bbbccc== string, which matches your PATTERN, is inside > the current match. > To be useful, the search needs to start AFTER the current match, therefore > your pattern is not even tried at this next position. > > By setting match end with \ze in your first pattern, you make it so the > current match ends BEFORE the ==bbbccc=== string, therefore allowing your > pattern to be tried and matched on this text. > > Now, how to fix this? Well...that depends on what you actually want. Somebody > suggested aaa\|ddd in your pattern, which will certainly match your example > text as desired, but I have a feeling the example text is actually not all > that similar to what you actually want to match. > > In what way are aaa and ddd similar? How do they differ from bbbccc? Is it a > matter of number of characters? If so, just replace \{-} with \{3} to match > exactly three characters, or \{1,3} for 1-3 characters, or \{0,3} to more > closely match what you have now. Or are you actually looking for a literal > aaa or ddd? > > -- > You received this message from the "vim_use" maillist. > Do not top-post! Type your reply below the text you are replying to. > For more information, visit http://www.vim.org/maillist.php -- You received this message from the "vim_use" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php
