@zlodiak

Почему regEx не работает в firefox?

В браузере chrome последней версии без проблем использую такое регулярное выражение:
/((?<!(д(ом)?|стр(оение)?|\/|-)\.?\s*\d*)\d+((,?\s*(к(ор(п(ус)?)?)?\.?)\s*\d+)|(\s*[а-я])|(\s*\/\s*\d+))?\s*$)/


Но браузер firefox не понимает такое регулярное выражение. Он выводит в консоль следующее сообщение об ошибке:
SyntaxError: invalid regexp group


Помогите пожалуйста переписать регулярное выражение так чтобы результат оставался тот же, но firefox не валился.

LIVE DEMO здесь.

Код:
// this function transform
// Татарстан, г. Казань, ул. Баумана, 36
// to
// Татарстан, г. Казань, ул. Баумана, д. 36

function transform(addr) {
  const regEx = /((?<!(д(ом)?|стр(оение)?|\/|-)\.?\s*\d*)\d+((,?\s*(к(ор(п(ус)?)?)?\.?)\s*\d+)|(\s*[а-я])|(\s*\/\s*\d+))?\s*$)/;
  const endStr = addr.match(regEx);
  let result;
  let ret;

  if(endStr && endStr[0]) {
    result = addr.replace(endStr[0], 'д. ' + endStr[0]);
  } else {
    result = addr;
  }

  return result;
}

console.log(transform('Татарстан, г. Казань, ул. Баумана, 36'));
  • Вопрос задан
  • 1600 просмотров
Решения вопроса 1
@dodo512
function transform(addr) {
    const regEx = /((д(ом)?|стр(оение)?|\/|-)\.?\s*|)\d+((,?\s*(к(ор(п(ус)?)?)?\.?)\s*\d+)|(\s*[а-я])|(\s*\/\s*\d+))?\s*$/;
    let result = addr.replace(regEx, function(m0, m1) {
        if (m1) {
            return m0;
        } else {
            return 'д. ' + m0;
        }
    });
    return result;
}

console.log(transform('Татарстан, г. Казань, ул. Баумана, 36'));
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
sergiks
@sergiks Куратор тега JavaScript
♬♬
FireFox пока не поддерживает lookbehind: (?<= ) и (?<! ), которые введены в ECMA2018.
Ответ написан
Комментировать
nyakove
@nyakove
Firefox не поддерживает "negative look-behind". https://bugzilla.mozilla.org/show_bug.cgi?id=1225665
Ответ написан
Комментировать
@Flying
regex101 тоже не может разобрать вашу регулярку, так что видимо вопрос в синтаксисе. Да и парсить адрес регуляркой - так себе идея, что вы будете делать если последовательность элементов в адресе будет другой или если там будут опечатки?

Возможно вам стоит рассмотреть использование внешних сервисов которые нормализуют адреса? К примеру я в одном проекте использовал DaData и они действительно хорошо работают (не реклама :) ).
Ответ написан
Ваш ответ на вопрос

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

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