# A case of catastrophic backtracking in Ruby+ −
#---------------------------------------------+ −
# example provided by Daniel Baldwin+ −
#+ −
# + −
# regex: (a?){n} a{n}+ −
# strings: aa...+ −
#+ −
# run on the command line with:+ −
#+ −
# $> ruby catastrophic.rb+ −
#+ −
+ −
nums = (1..1000)+ −
+ −
#iterate through the nums 1-1000+ −
nums.each do |i|+ −
+ −
start_time = Time.now+ −
string = "a" * i+ −
+ −
#create a new regular expression based on current value of i+ −
re_str = "a?" * i + "+" + "a" * i+ −
re = Regexp.new(re_str)+ −
+ −
re.match(string)+ −
+ −
#if re.match(string)+ −
# puts "matched string a * #{i} with regex #{re}"+ −
#else+ −
# puts "unmatched string a * #{i} with regex #{re}"+ −
#end+ −
+ −
puts "#{i} %.5f" % (Time.now - start_time)+ −
end+ −