Как я могу сопоставить несколько вхождений с регулярным выражением в JavaScript, похожим на PHP preg_match_all ()? - PullRequest
157 голосов
/ 06 февраля 2009

Я пытаюсь разобрать строки в кодировке URL, которые состоят из пар ключ = значение, разделенных либо &, либо &.

Следующее будет соответствовать только первому вхождению, разбивая ключи и значения на отдельные элементы результата:

var result = mystring.match(/(?:&|&)?([^=]+)=([^&]+)/)

Результаты для строки '1111342 = Адам% 20Franco & 348572 = Боб% 20Jones' будут:

['1111342', 'Adam%20Franco']

Использование глобального флага 'g' будет соответствовать всем вхождениям, но вернет только полностью соответствующие подстроки, а не разделенные ключи и значения:

var result = mystring.match(/(?:&|&)?([^=]+)=([^&]+)/g)

Результаты для строки '1111342 = Адам% 20Franco & 348572 = Боб% 20Jones' будут:

['1111342=Adam%20Franco', '&348572=Bob%20Jones']

Хотя я мог бы разбить строку на & и разбить каждую пару ключ / значение по отдельности, есть ли способ использовать поддержку регулярных выражений JavaScript для сопоставления нескольких вхождений шаблона /(?:&|&)?([^=]+)=([^&]+)/, аналогично функции PHP preg_match_all()?

Я стремлюсь к какому-нибудь способу получить результаты с разделенными под-матчами, например:

[['1111342', '348572'], ['Adam%20Franco', 'Bob%20Jones']]

или

[['1111342', 'Adam%20Franco'], ['348572', 'Bob%20Jones']]

Ответы [ 14 ]

0 голосов
/ 08 августа 2018

Чтобы избежать ада регулярных выражений, вы можете найти свой первый матч, отрубите кусок и попытайтесь найти следующий в подстроке. В C # это выглядит примерно так, извините, я не перенес это в JavaScript для вас.

        long count = 0;
        var remainder = data;
        Match match = null;
        do
        {
            match = _rgx.Match(remainder);
            if (match.Success)
            {
                count++;
                remainder = remainder.Substring(match.Index + 1, remainder.Length - (match.Index+1));
            }
        } while (match.Success);
        return count;
0 голосов
/ 30 октября 2017

Разделение выглядит как лучший вариант для меня:

'1111342=Adam%20Franco&348572=Bob%20Jones'.split('&').map(x => x.match(/(?:&|&)?([^=]+)=([^&]+)/))
0 голосов
/ 14 июня 2012

Чтобы захватить несколько параметров с использованием одного и того же имени, я изменил цикл while в методе Томалака следующим образом:

  while (match = re.exec(url)) {
    var pName = decode(match[1]);
    var pValue = decode(match[2]);
    params[pName] ? params[pName].push(pValue) : params[pName] = [pValue];
  }

ввод: ?firstname=george&lastname=bush&firstname=bill&lastname=clinton

возвращает: {firstname : ["george", "bill"], lastname : ["bush", "clinton"]}

0 голосов
/ 07 июня 2012

Ну ... у меня была похожая проблема ... Я хочу пошаговый поиск с RegExp (например: начать поиск ... выполнить некоторую обработку ... продолжить поиск до последнего соответствия)

После большого количества интернет-поиска ... как всегда (это становится привычкой) Я попал в StackOverflow и нашел ответ ...

Что не указано и что стоит упомянуть, это "lastIndex" Теперь я понимаю, почему объект RegExp реализует свойство lastIndex

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...