Tôi có biểu thức chính quy này:Có phải Ruby 1.9 biểu thức chính quy không kém phần mạnh mẽ đối với ngữ cảnh tự do ngữ cảnh không?
regex = %r{\A(?<foo> a\g<foo>a | b\g<foo>b | c)\Z}x
Khi tôi kiểm tra nó chống lại một số chuỗi, nó dường như là mạnh mẽ như một bối cảnh ngữ pháp miễn phí vì nó xử lý các đệ quy đúng cách.
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" có một ví dụ nơi ông thực sự sắp xếp tất cả các bộ phận của một regex để nó trông giống như một ngữ pháp ngữ cảnh miễn phí như sau:
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
giữa kỹ thuật của anh cho việc sắp xếp lại những phần của regex, và ví dụ của tôi về các nhóm thu hồi được đặt tên đệ quy, điều này có nghĩa là các biểu thức chính quy của Ruby 1.9 có sức mạnh tương đương với ngữ pháp không có ngữ cảnh không?
Đây là câu trả lời cho câu trả lời tôi đăng tại http://stackoverflow.com/questions/2626605/generalizing-the-pumping-lemma-for-unix-style-regular-expressions/2661176#2661176 –