如何修复regEx地址?

时间:2019-02-19 11:45:36

标签: javascript regex

请帮助修复regEx。遵循regex fine在chrome浏览器中有效,但在Firefox浏览器中不起作用。我使用了lookbehind,这在firefox中不支持:

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

LIVE DEMO here.

// 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 :(得分: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