Skip to content

Instantly share code, notes, and snippets.

@mdchaney
Created March 5, 2024 19:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mdchaney/808c59e13042cd40c58915daf2fc026f to your computer and use it in GitHub Desktop.
Save mdchaney/808c59e13042cd40c58915daf2fc026f to your computer and use it in GitHub Desktop.
Split name into first/last name
# words that indicate last name
#
# da
# de
# de la
# del
# di
# dos
# la
# van der
# vander
# van
# von
# st.
# san
# mc
# mac
#
# Suffixes
#
# Jr
# Sr
# II
# III
# IV
# V
# MD
#
# If there is a surname prefix (per above) we'll split on it, otherwise
# we'll split words, with that last word (plus suffix, if present) being
# the surname.
def split_name(name)
words = contact_name.split(/\s+/).select { |w| w =~ /[[:alpha:]]/ }
case
when words.count == 1
['', contact_name]
when words.count == 2
[words[0], words[1]]
else
if %w{jr sr ii iii iv v md}.include?(words.last.gsub(/[^[:alpha:]]/i, '').downcase)
last_name_word_count = 2
else
last_name_word_count = 1
end
first_name_word_count = words.count - last_name_word_count
found_last_name_prefix = false
if first_name_word_count > 2
last_two_words_of_first_name = words[(-last_name_word_count-2)..(-last_name_word_count-1)].join(' ').downcase
if ['de la', 'van der'].include?(last_two_words_of_first_name)
last_name_word_count += 2
found_last_name_prefix = true
end
end
if first_name_word_count > 1 && !found_last_name_prefix
if %w{da de del di dos la vander van von st san mc mac}.include?(words[-last_name_word_count-1].gsub(/[^[:alpha:]]/, '').downcase)
last_name_word_count += 1
end
end
first_name_word_count = words.count - last_name_word_count
[words[0..(first_name_word_count-1)].join(' '), words[-last_name_word_count..-1].join(' ')]
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment