# http://stackoverflow.com/q/38628521/5290909
regex = /^
(\s*) # matches the indentation (we'll backreference later)
def\ +has_many\b # literal "def has_many" with a word boundary
(?:.*+\n)*? # match whole lines - as few as possible
\1 # matches the same indentation as the def line
end\b # literal "end"
/x
subject = %q|
def has_many(name, scope = nil, options = {}, &extension)
if association.nil?
instance_variable_set("@#{association_name}", association)
end
end|
#Print matched text
puts subject.to_enum(:scan,regex).map {$&}
IyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcS8zODYyODUyMS81MjkwOTA5CgpyZWdleCA9IC9eCgkJKFxzKikgICAgICAgICAgICAgICMgbWF0Y2hlcyB0aGUgaW5kZW50YXRpb24gKHdlJ2xsIGJhY2tyZWZlcmVuY2UgbGF0ZXIpCgkJZGVmXCAraGFzX21hbnlcYiAgICMgbGl0ZXJhbCAiZGVmIGhhc19tYW55IiB3aXRoIGEgd29yZCBib3VuZGFyeQoJCSg/Oi4qK1xuKSo/ICAgICAgICAjIG1hdGNoIHdob2xlIGxpbmVzIC0gYXMgZmV3IGFzIHBvc3NpYmxlCgkJXDEgICAgICAgICAgICAgICAgICMgbWF0Y2hlcyB0aGUgc2FtZSBpbmRlbnRhdGlvbiBhcyB0aGUgZGVmIGxpbmUKCQllbmRcYiAgICAgICAgICAgICAgIyBsaXRlcmFsICJlbmQiCgkJL3gKCnN1YmplY3QgPSAlcXwKICBkZWYgaGFzX21hbnkobmFtZSwgc2NvcGUgPSBuaWwsIG9wdGlvbnMgPSB7fSwgJmV4dGVuc2lvbikKICAgICAgaWYgYXNzb2NpYXRpb24ubmlsPwogICAgICAgIGluc3RhbmNlX3ZhcmlhYmxlX3NldCgiQCN7YXNzb2NpYXRpb25fbmFtZX0iLCBhc3NvY2lhdGlvbikKICAgICAgZW5kCiAgZW5kfAoJCQoKI1ByaW50IG1hdGNoZWQgdGV4dApwdXRzIHN1YmplY3QudG9fZW51bSg6c2NhbixyZWdleCkubWFwIHskJn0=