Ho questa espressione regolare:Le espressioni regolari di Ruby 1.9 sono ugualmente potenti per una grammatica senza contesto?
regex = %r{\A(?<foo> a\g<foo>a | b\g<foo>b | c)\Z}x
quando i test contro diverse stringhe, sembra essere potente come una grammatica libera dal contesto perché gestisce la ricorsione in modo corretto.
regex.match("aaacaaa")
# => #<MatchData "aaacaaa" foo:"aaacaaa">
regex.match("aacaa")
# => #<MatchData "aacaa" foo:"aacaa">
regex.match("aabcbaa")
# => #<MatchData "aabcbaa" foo:"aabcbaa">
regex.match("aaacaa")
# => nil
"Fun with Ruby 1.9 Regular Expressions" ha un esempio in cui ha effettivamente organizza tutte le parti di una regex in modo che appaia come una grammatica context-free come segue:
sentence = %r{
(?<subject> cat | dog | gerbil ){0}
(?<verb> eats | drinks| generates){0}
(?<object> water | bones | PDFs ){0}
(?<adjective> big | small | smelly ){0}
(?<opt_adj> (\g<adjective>\s)? ){0}
The\s\g<opt_adj>\g<subject>\s\g<verb>\s\g<opt_adj>\g<object>
}x
Tra la sua tecnica per riorganizzare le parti della regex, e il mio esempio di gruppi di cattura denominati ricorsivi, significa che le espressioni regolari di Ruby 1.9 hanno il potere equivalente a una grammatica senza contesto?
Questo è un seguito alle risposte che ho postato su http://stackoverflow.com/questions/2626605/generalizing-the-pumping-lemma-for-unix-style-regular-expressions/2661176#2661176 –