Задумывались ли вы об «особых случаях», таких как: «Джон Смит, Нью-Йорк»? или «Нью-Йорк-Нью-Йорк» (имя может содержать пробел, а имя человека может совпадать с городом)
Я думаю, что более подходящее решение: для каждой строки str мы проверяем все названия города. Процедура проверки (псевдокод):
foreach str in strArray[]
foreach city in cities
tmp = Get the substring in the end of str, which equal the length of the "city"
if (tmp == city) then {name = substring(str, 0, strlen(str) - strlen(tmp)); break;}