Извлечение несопоставленных подстрок из почти одинаковых строк с помощью регулярных выражений

1

У меня есть документ REST, содержащий список форматов URL.

/com/shop/product/{product_id}
/com/shop/{shop_id}
/com/city/{city_name}/shop/{shop_id}/details

так далее..

И динамические URL-адреса выглядят примерно так:

/com/shop/product/0ab12h
/com/shop/j8khdj
/com/city/bangalore/shop/78hj67/details

Мой ввод будет динамическим URL.
И при передаче любого из динамического URL-адреса я хочу найти сопоставленный документированный URL-адрес вместе с отображением динамических значений и полей, помеченных в фигурных скобках.

Как для
/com/city/bangalore/shop/78hj67/details URL-адрес
/com/city/{city_name}/shop/{shop_id}/details

И карта должна быть

city_name -> bangalore
shop_id -> 78hj67


Я смог добиться этого с помощью обычных операций с строкой. Но я хочу сделать это с REGEX.
Можно ли это сделать?

  • 1
    Stackoverflow - это не бесплатная служба написания кода. Покажите, что у вас есть и что нужно изменить
  • 0
    Ранее я разделял динамический URL, используя '/'. И я получал все подстроки, которые также включают в себя динамические значения. И я перебирал URL-адреса документа. Я снова разбиваю и собираю подстроки. Затем при сравнении я получаю сопоставленный URL вместе с сопоставленными полями.
Показать ещё 3 комментария
Теги:
string-matching

2 ответа

1

Решить это с помощью регулярного выражения не особо сложно.

Для вашего приведенного выше примера вы можете использовать: (?:city\/)(\w+)(?:\/shop\/)(\w+) и найти ответы в матчах 1 и 2 (по ссылке в шаблоне, чтобы получить подробное объяснение шаблона).

const regex = /(?:city\/)(\w+)(?:\/shop\/)(\w+)/g;
const str = '/com/city/bangalore/shop/78hj67/details ';
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }

    // The result can be accessed through the 'm'-variable.
    m.forEach((match, groupIndex) => {
        console.log('Found match, group ${groupIndex}: ${match}');
    });
}

Поскольку вам, похоже, нужны разные части динамических URL-адресов, вы, вероятно, не сможете создать одно регулярное выражение, которое сделает все для вас. Вместо этого вы вынуждены писать несколько шаблонов, что, вероятно, не лучше, чем при использовании обычных строковых операций.

0

Я принял предложенный выше подход.
Обычно мы сопоставляем список строк с использованием одного регулярного выражения.
Но здесь его обратное. Каждый документированный URL-адрес является регулярным выражением, и его необходимо сопоставить с динамическим URL-адресом.
Итак, в цикле итерации,
документированный URL-адрес будет выбран один за другим и преобразован в регулярное выражение.

     // As fields inside curly braces can contain special characters
     // using /\{[^}]+\}/g as regex 
     // As dynamic URL won't contain special chars replacing it with (\w+)
     // Using () to group the dynamic fields

     var regexUrl = docUrl.replace(/\{[^}]+\}/g, "(\\w+)");
     regexUrl = "^" + regexUrl + "$";
     var res = dynUrl.match(regexUrl);

Если регулярное выражение соответствует шаблону, res будет содержать динамические значения URL-адреса.

     // Fetching dynamic fields from URL
     var dynFields = docUrl.match(/\{[^}]+\}/g); 

Используя dynFields и res мы можем иметь карту динамических полей и ее значений.

Проверьте скрипт https://jsfiddle.net/jr9zx1xe/

Этот подход более сложный, я думаю, что метод String или trie может быть полезен для уменьшения сложности.

  • 0
    Приятно. Рад, что вы смогли найти эффективное решение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню