Re: match and matchend with a negative lookbehind

2012-04-06 Thread rameo
Hi Ben and John,

Thank you for your answers.

Ben,
Yes I'm talking about a simple / search 
Sorry that I didn't add an example.
Please see the example in John example.
This is exactly what I've done and noted.

John,
Yes, that's what I getting.
I had never seen such a strange behavior with match() and matchend()



-- 
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


Re: match and matchend with a negative lookbehind

2012-04-06 Thread Ben Fritz
On Thursday, April 5, 2012 10:13:55 PM UTC-5, John Little wrote:
 On Friday, April 6, 2012 10:02:48 AM UTC+12, Ben Fritz wrote:
  Please give the EXACT command you ran...
 
 Perhaps this script will illustrate:
 
 let s = '-2 3-4-5-6-7-8'
 let p = '\([0-9-]\@!-\)\?\d[0-9]*'
 let [start, end] = [0, 0]
 while 1
 let start = match(s, p, end)
 let end   = matchend(s, p, end)
 if start == -1
 break
 endif
 echo s[start : end-1]
 endwhile
 
 I get:
 
 -2
 3
 -4
 -5
 -6
 -7
 -8
 
 It would appear that using the third parameter to match() and matchend(), the 
 match is done as if on a substring starting at the parameter, so the look 
 behind assertion does not see what's there in the original string.
 
 This is unlike searching in a buffer; the look behind assertion does look 
 behind the start position of the search. Rameo, is this what you're getting 
 at?
 

I think you've analyzed it perfectly! Looking closer at the help for match(), I 
see:

For a String, if {start}  0 then it is like the string starts
{start} bytes later, thus ^ will match at {start}.  Except
when {count} is given, then it's like matches before the
{start} byte are ignored

So with only 3 arguments, from this help text, I would expect exactly the 
results given, for the reason given.

However, this gave me a hint to fix the problem. With a minor tweak:

   let s = '-2 3-4-5-6-7-8'
let p = '\([0-9-]\@!-\)\?\d[0-9]*'
let [start, end] = [0, 0]
while 1
 count=1 to ignore previous matches rather than making the string
 start at a new place
let start = match(s, p, end, 1)
let end   = matchend(s, p, end, 1)
if start == -1
break
endif
echo s[start : end-1]
endwhile

It works as intended. With this script, I get:

-2
3
4
5
6
7
8

-- 
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


Re: match and matchend with a negative lookbehind

2012-04-06 Thread rameo
On Friday, April 6, 2012 5:04:19 PM UTC+2, Ben Fritz wrote:
 On Thursday, April 5, 2012 10:13:55 PM UTC-5, John Little wrote:
  On Friday, April 6, 2012 10:02:48 AM UTC+12, Ben Fritz wrote:
   Please give the EXACT command you ran...
  
  Perhaps this script will illustrate:
  
  let s = '-2 3-4-5-6-7-8'
  let p = '\([0-9-]\@!-\)\?\d[0-9]*'
  let [start, end] = [0, 0]
  while 1
  let start = match(s, p, end)
  let end   = matchend(s, p, end)
  if start == -1
  break
  endif
  echo s[start : end-1]
  endwhile
  
  I get:
  
  -2
  3
  -4
  -5
  -6
  -7
  -8
  
  It would appear that using the third parameter to match() and matchend(), 
  the match is done as if on a substring starting at the parameter, so the 
  look behind assertion does not see what's there in the original string.
  
  This is unlike searching in a buffer; the look behind assertion does look 
  behind the start position of the search. Rameo, is this what you're getting 
  at?
  
 
 I think you've analyzed it perfectly! Looking closer at the help for match(), 
 I see:
 
   For a String, if {start}  0 then it is like the string starts
   {start} bytes later, thus ^ will match at {start}.  Except
   when {count} is given, then it's like matches before the
   {start} byte are ignored
 
 So with only 3 arguments, from this help text, I would expect exactly the 
 results given, for the reason given.
 
 However, this gave me a hint to fix the problem. With a minor tweak:
 
let s = '-2 3-4-5-6-7-8'
 let p = '\([0-9-]\@!-\)\?\d[0-9]*'
 let [start, end] = [0, 0]
 while 1
  count=1 to ignore previous matches rather than making the string
  start at a new place
 let start = match(s, p, end, 1)
 let end   = matchend(s, p, end, 1)
 if start == -1
 break
 endif
 echo s[start : end-1]
 endwhile
 
 It works as intended. With this script, I get:
 
 -2
 3
 4
 5
 6
 7
 8

Works great!
I adapted it in the function copymatches which I once found on wikia.com 
http://vim.wikia.com/wiki/Copy_the_search_results_into_clipboard 
and it works.
Hope it will work in all documents ;)


-- 
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


match and matchend with a negative lookbehind

2012-04-05 Thread rameo
I noted a strange behavior with match and matchend when I use a regex with a 
negative lookbehind.

p.e. 
text in document:

  -2 3-4-5-6-7-8

search string: \([0-9-]\@!-\)\?\d[0-9]*
it highights -2 3 4 5 6 7 8 (as I aspected)

but when I check the match and matchend in order to copy the matches, it does 
include the - between 3-4 4-5 5-6 6-7 7-8
Does match and matchend not work with a negative lookbehind?

(please see attachment if the search string doesn't show up correct)

 

-- 
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
attachment: match-matchend.jpg

Re: match and matchend with a negative lookbehind

2012-04-05 Thread Ben Fritz
On Thursday, April 5, 2012 1:53:13 PM UTC-5, rameo wrote:
 I noted a strange behavior with match and matchend when I use a regex with a 
 negative lookbehind.
 
 p.e. 
 text in document:
 
   -2 3-4-5-6-7-8
 
 search string: \([0-9-]\@!-\)\?\d[0-9]*
 it highights -2 3 4 5 6 7 8 (as I aspected)
 

Highlights when you do what? Are you talking about a simple / search or a 
syntax highlight or something else?

 but when I check the match and matchend in order to copy the matches, it does 
 include the - between 3-4 4-5 5-6 6-7 7-8

match() and matchend() are functions which work on a string, they don't look at 
buffer text. In what way did you use these on the text? How do you know it 
includes the -? Or are you referring to something other than match() and 
matchend()?

 Does match and matchend not work with a negative lookbehind?
 

They should. Please give the EXACT command you ran, and tell exactly what you 
expected, and exactly what happened instead. A script which will reproduce what 
you see would be best.

-- 
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


Re: match and matchend with a negative lookbehind

2012-04-05 Thread John Little
On Friday, April 6, 2012 10:02:48 AM UTC+12, Ben Fritz wrote:
 Please give the EXACT command you ran...

Perhaps this script will illustrate:

let s = '-2 3-4-5-6-7-8'
let p = '\([0-9-]\@!-\)\?\d[0-9]*'
let [start, end] = [0, 0]
while 1
let start = match(s, p, end)
let end   = matchend(s, p, end)
if start == -1
break
endif
echo s[start : end-1]
endwhile

I get:

-2
3
-4
-5
-6
-7
-8

It would appear that using the third parameter to match() and matchend(), the 
match is done as if on a substring starting at the parameter, so the look 
behind assertion does not see what's there in the original string.

This is unlike searching in a buffer; the look behind assertion does look 
behind the start position of the search. Rameo, is this what you're getting at?

Regards, John

-- 
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