У меня есть это регулярное выражение:
regex = %r{\A(?<foo> a\g<foo>a | b\g<foo>b | c)\Z}x
Когда я проверяю его на несколько строк, он кажется таким же мощным, как контекстная свободная грамматика, потому что он правильно рекурсивно обрабатывает.
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 Exions" имеет пример, где он фактически упорядочивает все части регулярного выражения так, чтобы он выглядел как контекстно-свободная грамматика следующим образом
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
Между его техникой переупорядочения частей регулярного выражения и моим примером рекурсивных именных групп захвата, означает ли это, что регулярные выражения Ruby 1.9 имеют силу, эквивалентную контекстно-свободной грамматике?