请帮助修复regEx。遵循regex fine在chrome浏览器中有效,但在Firefox浏览器中不起作用。我使用了lookbehind,这在firefox中不支持:
/((?<!(д(ом)?|стр(оение)?|\/|-)\.?\s*\d*)\d+((,?\s*(к(ор(п(ус)?)?)?\.?)\s*\d+)|(\s*[а-я])|(\s*\/\s*\d+))?\s*$)/
// 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方法即可解决此问题。谢谢
答案 0 :(得分:3)
您可以将后面的否定后视转换为可选的捕获组:
(?<!....) => (....)?
所以
/((?<!(д(ом)?|стр(оение)?|\/|-)\.?\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