我有这个正则表达式:
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 Expressions ”有一个例子,他实际上安排了一个正则表达式的所有部分,使它看起来像一个上下文无关的语法,如下所示:
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 正则表达式具有等同于上下文无关语法的能力?