Как исправить адрес regEx? - PullRequest
0 голосов
/ 19 февраля 2019

Пожалуйста, помогите исправить regEx.Следуйте регулярному выражению, прекрасно работающему в браузере Chrome, но оно не работает в браузере Firefox.Я использую lookbehind, который не поддерживается в Firefox:

/((?<!(д(ом)?|стр(оение)?|\/|-)\.?\s*\d*)\d+((,?\s*(к(ор(п(ус)?)?)?\.?)\s*\d+)|(\s*[а-я])|(\s*\/\s*\d+))?\s*$)/

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'));

PS: к сожалению, адрес может состоять из нескольких (2 или 3или 4 или 5 или 6 или режим) частей.

Мне нужен только подход RegEx для решения этой проблемы.Спасибо

1 Ответ

0 голосов
/ 20 февраля 2019

Вы можете преобразовать отрицательный вид сзади в необязательную группу захвата:

(?<!....) => (....)?

Итак,

/((?<!(д(ом)?|стр(оение)?|\/|-)\.?\s*\d*)\d+((,?\s*(к(ор(п(ус)?)?)?\.?)\s*\d+)|(\s*[а-я])|(\s*\/\s*\d+))?\s*$)/
 V                                        VV   
/((?:д(?:ом)?|стр(?:оение)?|\/|-)\.?\s*\d*)?\d+((,?\s*(к(ор(п(ус)?)?)?\.?)\s*\d+)|(\s*[а-я])|(\s*\/\s*\d+))?\s*$)/

Затем при выполнении замены проверьте, не является ли группа 1 неопределенной,и если нет, то вы знаете, что шаблон просмотра за спиной совпадает, и это совпадение не должно было произойти, следовательно, в этом случае замените все совпадение обратно.Иначе, добавьте текст, который вам нужен.

Вот обновленная функция:

function transform(addr) {
  const regEx = /((?:д(?:ом)?|стр(?:оение)?|\/|-)\.?\s*\d*)?\d+(?:,?\s*к(?:ор(?:п(?:ус)?)?)?\.?\s*\d+|\s*[а-яё]|\s*\/\s*\d+)?\s*$/;
  return addr.replace(regEx, ($0, $1) => $1 ? $0 : 'д. ' + $0);
}

Примечание Я удалил все избыточные группы захвата или преобразовал в незаписываемые (заменил (...) на (?:...)).

JS демо:

function transform(addr) {
  const regEx = /((?:д(?:ом)?|стр(?:оение)?|\/|-)\.?\s*\d*)?\d+(?:,?\s*к(?:ор(?:п(?:ус)?)?)?\.?\s*\d+|\s*[а-яё]|\s*\/\s*\d+)?\s*$/;
  return addr.replace(regEx, ($0, $1) => $1 ? $0 : 'д. ' + $0);
}

console.log(transform('Татарстан, г. Казань, ул. Баумана, 36'));          // Replacement occurs
console.log(transform('Татарстан, г. Казань, ул. Баумана, д. 36'));       // No replacement
console.log(transform('Татарстан, г. Казань, ул. Баумана, дом 36'));      // No replacement
console.log(transform('Татарстан, г. Казань, ул. Баумана, дом36'));       // No replacement
console.log(transform('Татарстан, г. Казань, ул. Баумана, стр36'));       // No replacement
console.log(transform('Татарстан, г. Казань, ул. Баумана, стр.36'));      // No replacement
console.log(transform('Татарстан, г. Казань, ул. Баумана, строение.36')); // No replacement
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...