Recursive regular expressions in Ruby?

J

Jarmo Pertman

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
 
J

Josh Cheek

[Note: parts of this message were removed to make it a legal post.]

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

Robert Klemme

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.

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
 
J

Jarmo Pertman

Thanks!

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

Jarmo

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.

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

Josh Cheek

[Note: parts of this message were removed to make it a legal post.]

Thanks!

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

Jarmo

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.

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,968
Messages
2,570,153
Members
46,699
Latest member
AnneRosen

Latest Threads

Top