This page contains automated test results for code from O'Reilly's Ruby Cookbook. If this code looks interesting or useful, you might want to buy the whole book.
| Replacing Multiple Patterns in a Single Pass | ||
|---|---|---|
| Code | Expected | Actual |
class String
def mgsub(key_value_pairs=[].freeze)
regexp_fragments = key_value_pairs.collect { |k,v| k }
gsub(Regexp.union(*regexp_fragments)) do |match|
key_value_pairs.detect{|k,v| k =~ match}[1]
end
end
end
"GO HOME!".mgsub([[/.*GO/i, 'Home'], [/home/i, 'is where the heart is']]) |
"Home is where the heart is!" | "Home is where the heart is!" |
"Here is number #123".mgsub([[/[a-z]/i, '#'], [/#/, 'P']]) |
"#### ## ###### P123" | "#### ## ###### P123" |
"FOO bar".gsub(/foo/i, "The bar").gsub(/bar/m, "result") |
"The result result" | "The result result" |
"Here is number #123".gsub(/[a-z]/i, "#").gsub(/#/, "P") |
"PPPP PP PPPPPP P123" | "PPPP PP PPPPPP P123" |
"between".mgsub(/ee/ => 'AA', /e/ => 'E') # Bad code |
"bEtwEEn" | "bEtwEEn" |
"between".mgsub([[/ee/, 'AA'], [/e/, 'E']]) # Good code |
"bEtwAAn" | "bEtwAAn" |