Very great explanation! Many thanks to Gerald and Chip Campbell. Now I
_really_ got it. :)
On 6/13/06, Charles E Campbell Jr <[EMAIL PROTECTED]> wrote:
>> It follows the general form of a negative line search for embedded
>> <search>:
>>
>> /^\%(.*[<limit0>.*]<search>[.*<limit1>]\)[EMAIL PROTECTED]
>>
>> For example, to match a line that contains "foo" but does not contain
>> "bar" between "big" and "tummy":
>>
>> /\%(.*big.*bar.*tummy\)[EMAIL PROTECTED]
>
Edward Wong wrote:
> Learn a lot more about regexp from this post. Thanks!
>
>> Sorry, I missed the ^ anchor:
>>
>> /^\%(.*big.*bar.*tummy\)[EMAIL PROTECTED]
>>
>
> Just a question, why it is necessary to have the ^ anchor? Isn't .*
> already includes the characters start from the beginning of the line?
> Sorry if I'm asking a stupid one....
Not a stupid question at all. [EMAIL PROTECTED] and variants are tricky (IMHO).
Considering:
/^\%(.*big.*bar.*tummy\)[EMAIL PROTECTED]
First, big.*bar.*tummy can not match quite often! Just as [EMAIL PROTECTED]
ordered.
So look at the following two lines:
big junk bar junk tummy junk foo
junk bar junk tummy junk foo
Its best to :set hls first, so as to see what matches. Try matching
with and without that leading "^". With the "^",
big junk bar junk tummy junk foo <-- doesn't match
junk bar junk tummy junk foo <-- matches
which is what one would expect. However, without that "^", the pattern
is free to start matching _after_ the start-of-line, and so
ig junk bar junk tummy junk foo <-- matches
junk bar junk tummy junk foo <-- matches
(I left off the non-matching "b" in the first line). Thus, both lines
match, which isn't what's wanted, especially considering the regexp
was expected to be used with :g/regex-here/somecmd
Regards,
Chip Campbell
--
Ed