Skip to content

Instantly share code, notes, and snippets.

@dsomel21
Created June 17, 2016 05:05
Show Gist options
  • Select an option

  • Save dsomel21/9dfdf8bd8e3cfef3763dec044c6111cc to your computer and use it in GitHub Desktop.

Select an option

Save dsomel21/9dfdf8bd8e3cfef3763dec044c6111cc to your computer and use it in GitHub Desktop.
Collection of challenging intro regex exercises
# Determine whether a string contains a SIN (Social Insurance Number).
# A SIN is 9 digits and we are assuming that they must have dashes in them
require 'pry'
def has_sin?(string)
!!string.match(/\b\d{3}-\d{3}-\d{3}\b/)
end
puts "\nhas_sin? returns true if it has what looks like a SIN"
puts has_sin?("please don't share this: 234-604-142") #== true
puts "\nhas_sin? returns false if it doesn't have a SIN"
puts has_sin?("please confirm your identity: XXX-XXX-142")# == false
puts has_sin?("please don't share this: 234-6043-142") #== false
puts has_sin?("please don't share this: 2342-604-142") #== false
puts has_sin?("please don't share this: 234-604-1421") #== false
# Return the Social Insurance Number from a string.
def grab_sin(string)
m = string.match(/\b\d{3}-\d{3}-\d{3}\b/)
#binding.pry
return m[0] if !m.nil?
end
puts "\ngrab_sin returns an SIN if the string has an SIN"
puts grab_sin("please don't share this: 234-604-142") #== "234-604-142"
puts "\ngrab_sin returns nil if it doesn't have a SIN"
puts grab_sin("please confirm your identity: XXX-XXX-142") #== nil
# Return all of the SINs from a string, not just one.
def grab_all_sins(string)
the_array = []
string.scan(/\b\d{3}-\d{3}-\d{3}\b/) {|match| the_array.push(match)}
return the_array
end
puts "\ngrab_all_sins returns all SINs if the string has any SINs"
puts grab_all_sins("234-604-142, 350-802-074, 013-630-876") == ["234-604-142", "350-802-074", "013-630-876"]
puts "\ngrab_all_sins returns an empty Array if it doesn't have any SINs"
puts grab_all_sins("please confirm your identity: XXX-XXX-142") == []
# Obfuscate all of the Social Insurance numbers in a string. Example: XXX-XX-4430.
# "hello".gsub(/([aeiou])/){ |m| "<#{$1}>" } #=> "h<e>ll<o>"
def hide_all_sins(string)
string.gsub(/\b\d{3}-\d{3}/) { |match| "XXX-XXX"}
end
puts "\ngrab_sin returns nil if it doesn't have a SIN"
puts "\nhide_all_sins obfuscates any SINs in the string"
puts hide_all_sins("234-601-142, 350-801-074, 013-601-876") == "XXX-XXX-142, XXX-XXX-074, XXX-XXX-876"
puts "\nhide_all_sins does not alter a string without SINs in it"
string = "please confirm your identity: XXX-XXX-142"
puts hide_all_sins(string) == string
# Ensure all of the Social Insurance numbers use dashes for delimiters.
# Example: 480.01.4430 and 480014430 would both be 480-01-4430.
def format_sins(string)
# single = string.delete(". -")
# i = single.length % 3
# if single.length % 3 == 0
# single.insert(0, "-")
# end
reg = (/(\d{3})(-|.)?(\d{3})(-|.)?(\d{3})/)
return string.gsub(reg, '\1-\3-\5')
end
puts "format_sins finds and reformat any SINs in the string"
puts format_sins("234600142, 350.800.074, 013-600-876") == "234-600-142, 350-800-074, 013-600-876"
puts "format_sins does not alter a string without SINs in it"
string = "please confirm your identity: 4421422"
puts format_sins(string) == string
string = "please confirm your identity: 123abc445"
puts format_sins(string) == string
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment