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

It seems that also PHP has such a functionality.

Jarmo

On Mon, Jan 31, 2011 at 5:05 PM, Jarmo P. [email protected]
wrote:

It seems that also PHP has such a functionality.

Jarmo

1.9.2 has it, here is an example:

regex = /^(?[(\g|\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.

Thanks!

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

Jarmo

On Tue, Feb 1, 2011 at 2:50 AM, Jarmo P. [email protected] wrote:

Hi!

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 12:05 AM, Jarmo P. [email protected]
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.

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/((?((?:\[()]|[^()]|\g))))/
=> /((?((?:\[()]|[^()]|\g)
)))/
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