splincodewd
@splincodewd
Developer

Как найти город в строке?

Есть задача, нахождения подстроки в строке, в принципе это не проблема, если использовать indexOf()
Но дело в том, что мы не знаем, что ищем, мы знаем только контекст

У нас строки могут быть такого типа:
" .. from X to Y .. "
" .. из города X в город Y .. "
" .. из X в Y .. " (поможете регулярное выражение написать для этого случая, чтобы вытащить X и Y?)
" .. X - Y .. "

где X и Y предполагаемые города

Конечно, можно делать запрос к карте мира (Google) и сравнивать в строке X1 с X, Y1 с Y и тд
Но ведь городов в мире сотни тысяч, и это бессмысленно получается, нагрузка высокая

Ладно, когда пишем регулярное выражение для чисел и тд, но тут то как?
  • Вопрос задан
  • 537 просмотров
Решения вопроса 1
rpsv
@rpsv
делай либо хорошо, либо никак
Для первых трех:
(?:from|из города|из)[ ]+([\wА-Яа-я\- ]+)[ ]+(?:to|в город|в) ([\wА-Яа-я\- ]+)

Для последнего:
([\wА-Яа-я\- ]+) - ([\wА-Яа-я\- ]+)
Чтобы последняя корректно работала к примеру с "Каменск-уральский", нужно чтобы разделяющее тире ОБЯЗАТЕЛЬНО обрамлялось пробелами (" - "), а типе в городах нет ("Ростов-на-дону", "Каменск-Уральский")...
-
Хороший сервис для работы с регулярками: https://regex101.com
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
keslo
@keslo
Можно так сделать.
Если учесть, что города начинаются с большой буквы и находятся не первым словом в предложении, то:

var s='from Moscow to Piter';
/* var s=' Moscow - Piter '; */
/* var s='из города Moscow в город Piter'; */
/* var s='из Moscow в Piter'; */

function findCities(str) {
	var cities = [];
	var strArray = str.split(' ');
  for (var i=1; i<strArray.length; i++) {
  	if(strArray[i][0] === strArray[i][0].toUpperCase()) cities.push(strArray[i]);
  }
 	return cities;
}
console.log(findCities(s)); // получаем на выходе ["Moscow", "Piter"]

Пример работы https://jsfiddle.net/keslo/82wkc9L2/
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы