Recursive regular expressions in Ruby?

Hi!

I was just wondering if there is possible to write recursive regular
expressions in Ruby? As i'm understanding at this moment then there
isn't. Prove me wrong.

If you're not aware of such possibility in Perl for example then here
is one good blog post about it http://www.catonmat.net/blog/recursive-regular-expressions

It seems that also PHP has such a functionality.

Jarmo

1.9.2 has it, here is an example:

regex = /^(?<bracketed>\[(\g<bracketed>|\d)\])$/
       '1'.match regex # => nil
     '[1]'.match regex # => #<MatchData "[1]" bracketed:"[1]">
   '[[1]]'.match regex # => #<MatchData "[[1]]" bracketed:"[[1]]">
'[[[1]]]'.match regex # => #<MatchData "[[[1]]]" bracketed:"[[[1]]]">

I found it in the Christmas edition of PragPub (
http://pragprog.com/magazines/download/19.PDF\) they talk about it more in
depth, as well, if you want more info.

···

On Mon, Jan 31, 2011 at 5:05 PM, Jarmo Pertman <jarmo.p@gmail.com> wrote:

Hi!

I was just wondering if there is possible to write recursive regular
expressions in Ruby? As i'm understanding at this moment then there
isn't. Prove me wrong.

If you're not aware of such possibility in Perl for example then here
is one good blog post about it
Recursive Regular Expressions

It seems that also PHP has such a functionality.

Jarmo

Strictly speaking these are no more regular expressions any more
because the set of languages that they can detect exceeds the set of
regular languages. Normally you need at least a parser for a context
free language to detect nested brackets etc. (There are quite a few
parser generators available for Ruby.)

But: Oniguruma can do it, too:

Ruby version 1.9.2
irb(main):001:0> re = %r/((?<pg>\((?:\\[()]|[^()]|\g<pg>)*\)))/
=> /((?<pg>\((?:\\[()]|[^()]|\g<pg>)*\)))/
irb(main):002:0> s = 'some(stri\)\((()x)(((c)d)e)\))ng'
=> "some(stri\\)\\((()x)(((c)d)e)\\))ng"
irb(main):003:0> mt = s.match re
=> #<MatchData "(stri\\)\\((()x)(((c)d)e)\\))"
pg:"(stri\\)\\((()x)(((c)d)e)\\))">
irb(main):004:0> mt[1]
=> "(stri\\)\\((()x)(((c)d)e)\\))"

http://www.siaris.net/index.cgi/+Programming/LanguageBits/Ruby/Oniguruma.rdoc

Kind regards

robert

···

On Tue, Feb 1, 2011 at 12:05 AM, Jarmo Pertman <jarmo.p@gmail.com> wrote:

I was just wondering if there is possible to write recursive regular
expressions in Ruby? As i'm understanding at this moment then there
isn't. Prove me wrong.

If you're not aware of such possibility in Perl for example then here
is one good blog post about it Recursive Regular Expressions

It seems that also PHP has such a functionality.

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

Thanks!

It seems that you've given wrong link as i've unable to find anything
regarding "regular expressions" in that pdf.

Jarmo

···

On Feb 1, 5:34 am, Josh Cheek <josh.ch...@gmail.com> wrote:

On Mon, Jan 31, 2011 at 5:05 PM, Jarmo Pertman <jarm...@gmail.com> wrote:
> Hi!

> I was just wondering if there is possible to write recursive regular
> expressions in Ruby? As i'm understanding at this moment then there
> isn't. Prove me wrong.

> If you're not aware of such possibility in Perl for example then here
> is one good blog post about it
>Recursive Regular Expressions

> It seems that also PHP has such a functionality.

> Jarmo

1.9.2 has it, here is an example:

regex = /^(?<bracketed>\[(\g<bracketed>|\d)\])$/
'1'.match regex # => nil
'[1]'.match regex # => #<MatchData "[1]" bracketed:"[1]">
'[[1]]'.match regex # => #<MatchData "[[1]]" bracketed:"[[1]]">
'[[[1]]]'.match regex # => #<MatchData "[[[1]]]" bracketed:"[[[1]]]">

I found it in the Christmas edition of PragPub (http://pragprog.com/magazines/download/19.PDF\) they talk about it more in
depth, as well, if you want more info.

You're right, that was the January edition. Here is the one I meant to link
to, Dec 2010 http://pragprog.com/magazines/download/18.PDF

It is in section "what's new in Ruby 1.9.2" on page 24

···

On Tue, Feb 1, 2011 at 2:50 AM, Jarmo Pertman <jarmo.p@gmail.com> wrote:

Thanks!

It seems that you've given wrong link as i've unable to find anything
regarding "regular expressions" in that pdf.

Jarmo

On Feb 1, 5:34 am, Josh Cheek <josh.ch...@gmail.com> wrote:
> On Mon, Jan 31, 2011 at 5:05 PM, Jarmo Pertman <jarm...@gmail.com> > wrote:
> > Hi!
>
> > I was just wondering if there is possible to write recursive regular
> > expressions in Ruby? As i'm understanding at this moment then there
> > isn't. Prove me wrong.
>
> > If you're not aware of such possibility in Perl for example then here
> > is one good blog post about it
> >Recursive Regular Expressions
>
> > It seems that also PHP has such a functionality.
>
> > Jarmo
>
> 1.9.2 has it, here is an example:
>
> regex = /^(?<bracketed>\[(\g<bracketed>|\d)\])$/
> '1'.match regex # => nil
> '[1]'.match regex # => #<MatchData "[1]" bracketed:"[1]">
> '[[1]]'.match regex # => #<MatchData "[[1]]" bracketed:"[[1]]">
> '[[[1]]]'.match regex # => #<MatchData "[[[1]]]" bracketed:"[[[1]]]">
>
> I found it in the Christmas edition of PragPub (
http://pragprog.com/magazines/download/19.PDF\) they talk about it more in
> depth, as well, if you want more info.