У меня есть это регулярное выражение:
regex = %r{\A(? a\ga | b\gb | c)\Z}x
Когда я проверяю его на нескольких строках, оно кажется таким же мощным, как контекстно-свободная грамматика, потому что оно правильно обрабатывает рекурсию.
regex.match("aaacaaa")
# => #
regex.match("aacaa")
# => #
regex.match("aabcbaa")
# => #
regex.match("aaacaa")
# => nil
"Fun with Ruby 1.9 Regular Expressions" есть пример, в котором он фактически упорядочивает все части регулярного выражения так, что оно выглядит как бесконтекстная грамматика следующим образом:
sentence = %r{
(? cat | dog | gerbil ){0}
(? eats | drinks| generates ){0}
(?
Между его техникой перестановки частей регулярного выражения и моим примером рекурсивных именованных групп захвата, означает ли это, что регулярные выражения Ruby 1.9 имеют мощность, эквивалентную бесконтекстной грамматике?