Самый длинный путь regex матч

Я работаю над обработчиком MQTT, для которого я хочу создать событие для самого длинного сопоставления имен событий. Образец:

Я слушаю несколько событий:

  • test
  • test/replyer/
  • test/replyer/request

И я собираюсь получить сообщение с темой, test/replyer/request/@issuerкоторая должна вызвать событие test/replyer/request.

Есть ли стратегия regexp, которая может помочь мне найти, какой самый большой путь соответствия в javascript?

РЕДАКТИРОВАТЬ:

test, replyerи requestявляются произвольными строками для примера. Список событий выше может быть любым, что может появиться на пути. Длина пути также неизвестна.

1 ответ

  1. Если это те события, которые вы слушаете, вы можете использовать это regex:

    /test\/(?:replyer\/(?:request\/)?)?/
    

    тестер regex

    Если события могут быть чем-то и должны быть извлечены из URL, то ваш вопрос действительно состоит в том, чтобы найти часть пути URL в целом:

    /.*?(?=\/[^\/]*$)/
    

    тестер regex

    функция JavaScript:

    function eventFromUrl(url) {
      return (url.match(/.*?(?=\/[^\/]*$)/) || []).pop();
    }
    var url = 'test/replyer/request/@issuer';
    document.write(eventFromUrl(url));

    Если у вас есть список допустимых событий (путей), то вы можете использовать вышеизложенное и отсекать от пути, пока у вас есть один, который находится в списке:

    function eventFromUrl(url) {
      return (url.match(/.*?(?=\/[^\/]*$)/) || []).pop();
    }
    var validEvents = {
      'test/replyer': 1,
      'test/replyer/request': 1,
      'test': 1,
      'test/requester': 1,
      'test/requester/request': 1,
      'test/replyer/report': 1,
    };
    var url = 'test/replyer/request/@issuer';
    for (var event = url; event && !validEvents[event]; event = eventFromUrl(event));
    document.write (event);