Вы можете преобразовать отрицательный вид сзади в необязательную группу захвата:
(?<!....) => (....)?
Итак,
/((?<!(д(ом)?|стр(оение)?|\/|-)\.?\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