Doubt with positive lookaround

I do not understand behavior of positive look arounds in Ruby:

chunked_data = "DIVex>##ECHO=b698fd4cc1ea4c7a4b5c4e1d1c402911##"
p $& if chunked_data =~ /(?=DIVex)DI/ # => DI

However,

chunked_data = "<DIVex>##ECHO=b698fd4cc1ea4c7a4b5c4e1d1c402911##"
p $& if chunked_data =~ /(?=<DIVex)DI/ # => nil

does < gets treated as special character inside (?= ..) ?

···

--
There was only one Road; that it was like a great river: its springs
were at every doorstep, and every path was its tributary.

No, but lookahead assertions are zero-width, so if your assertion
matches <DIV, your cursor is still before the <, and thus won't match
DI. p $& if chunked_data =~ /(?=<DIVex)<DI/ works fine.

martin

···

On 12/5/06, hemant <gethemant@gmail.com> wrote:

I do not understand behavior of positive look arounds in Ruby:

chunked_data = "DIVex>##ECHO=b698fd4cc1ea4c7a4b5c4e1d1c402911##"
p $& if chunked_data =~ /(?=DIVex)DI/ # => DI

However,

chunked_data = "<DIVex>##ECHO=b698fd4cc1ea4c7a4b5c4e1d1c402911##"
p $& if chunked_data =~ /(?=<DIVex)DI/ # => nil

does < gets treated as special character inside (?= ..) ?

There are a few types of "lookarounds": positive lookahead, negative lookahead, positve lookbehind, negative look behind.

To use positive lookbehind, you would use (?<=...). Ruby might be interpreting ?=< as ?<=. Try escaping the < by adding a \ before it.

···

----- Original Message -----
From: hemant
Date: Monday, December 4, 2006 11:29 pm
Subject: doubt with positive lookaround
To: ruby-talk@ruby-lang.org (ruby-talk ML)

I do not understand behavior of positive look arounds in Ruby:

chunked_data = "DIVex>##ECHO=b698fd4cc1ea4c7a4b5c4e1d1c402911##"
p $& if chunked_data =~ /(?=DIVex)DI/ # => DI

However,

chunked_data = "##ECHO=b698fd4cc1ea4c7a4b5c4e1d1c402911##"
p $& if chunked_data =~ /(?= nil

does < gets treated as special character inside (?= ..) ?

--
There was only one Road; that it was like a great river: its springs
were at every doorstep, and every path was its tributary.

Holy cat...thanks

···

On 12/5/06, Martin DeMello <martindemello@gmail.com> wrote:

On 12/5/06, hemant <gethemant@gmail.com> wrote:
> I do not understand behavior of positive look arounds in Ruby:
>
> chunked_data = "DIVex>##ECHO=b698fd4cc1ea4c7a4b5c4e1d1c402911##"
> p $& if chunked_data =~ /(?=DIVex)DI/ # => DI
>
> However,
>
> chunked_data = "<DIVex>##ECHO=b698fd4cc1ea4c7a4b5c4e1d1c402911##"
> p $& if chunked_data =~ /(?=<DIVex)DI/ # => nil
>
> does < gets treated as special character inside (?= ..) ?

No, but lookahead assertions are zero-width, so if your assertion
matches <DIV, your cursor is still before the <, and thus won't match
DI. p $& if chunked_data =~ /(?=<DIVex)<DI/ works fine.

--
There was only one Road; that it was like a great river: its springs
were at every doorstep, and every path was its tributary.

The regex engine in Ruby 1.8 does not support look-behind assertions. The regex engine in 1.9, Oniguruma, does.

James Edward Gray II

···

On Dec 5, 2006, at 12:58 PM, danfinnie@optonline.net wrote:

There are a few types of "lookarounds": positive lookahead, negative lookahead, positve lookbehind, negative look behind.

To use positive lookbehind, you would use (?<=...). Ruby might be interpreting ?=< as ?<=. Try escaping the < by adding a \ before it.

Yup James I am aware of that. I was blind enough to not see my silly mistake.

Thanks

···

On 12/6/06, James Edward Gray II <james@grayproductions.net> wrote:

On Dec 5, 2006, at 12:58 PM, danfinnie@optonline.net wrote:

> There are a few types of "lookarounds": positive lookahead,
> negative lookahead, positve lookbehind, negative look behind.
>
> To use positive lookbehind, you would use (?<=...). Ruby might be
> interpreting ?=< as ?<=. Try escaping the < by adding a \ before it.

The regex engine in Ruby 1.8 does not support look-behind
assertions. The regex engine in 1.9, Oniguruma, does.

--
There was only one Road; that it was like a great river: its springs
were at every doorstep, and every path was its tributary.