Я пытаюсь проанализировать строки в кодировке 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, чтобы сопоставить множественные вхождения шаблона, /(?:&|&)?([^=]+)=([^&]+)/
аналогичные PHPpreg_match_all()
функции ?
Я стремлюсь к какому-то способу получить результаты с разделенными под-матчами, например:
[['1111342', '348572'], ['Adam%20Franco', 'Bob%20Jones']]
или
[['1111342', 'Adam%20Franco'], ['348572', 'Bob%20Jones']]
источник
replace
здесь.var data = {}; mystring.replace(/(?:&|&)?([^=]+)=([^&]+)/g, function(a,b,c,d) { data[c] = d; });
сделано. «matchAll» в JavaScript - это «заменить» функцией замены вместо строки.Ответы:
Поднято из комментариев
Поддержка браузера указана здесь https://caniuse.com/#feat=urlsearchparams
Я бы предложил альтернативное регулярное выражение, используя подгруппы для индивидуального ввода имени и значения параметров и
re.exec()
:result
это объект:Регулярное выражение разбивается следующим образом:
источник
x = y
бы приписыватьy
к ,x
а также производитьy
). Когда мы применяем эти знания кif (match = re.exec(url))
: А) выполняет задание и Б) возвращает результатre.exec(url)
вwhile
. Теперьre.exec
возвращает,null
если совпадения нет, что является ложным значением. Таким образом, в действительности цикл будет продолжаться до тех пор, пока есть совпадение.Вам нужно использовать переключатель «g» для глобального поиска
источник
2020 редактировать
Используйте URLSearchParams , так как для этого задания больше не требуется никакого специального кода. Браузеры могут сделать это за вас с помощью одного конструктора:
доходность
Так что для этого больше нет причин использовать регулярные выражения.
Оригинальный ответ
Если вы не хотите полагаться на «слепое сопоставление», которое идет с
exec
сопоставлением стилей бега , JavaScript имеет встроенную функциональность сопоставления всех, но это частьreplace
вызова функции, когда используется «что делать с захватом». группы» функции обработки :сделано.
Вместо использования функции обработки группы захвата для фактического возврата замещающих строк (для обработки замены первый аргумент - это полное совпадение с образцом, а последующие аргументы - отдельные группы захвата), мы просто берем захваты групп 2 и 3 и кэшируем эту пару.
Таким образом, вместо того, чтобы писать сложные функции синтаксического анализа, помните, что функция «matchAll» в JavaScript просто «заменяет» на функцию обработчика замены, и можно добиться значительной эффективности сопоставления с образцом.
источник
something "this one" and "that one"
. Я хочу поместить все строки в двойных кавычках в список, т. Е. [Этот, тот]. До сих порmystring.match(/"(.*?)"/)
хорошо работает при обнаружении первого, но я не знаю, как адаптировать ваше решение для одной группы захвата.Для захвата групп я привык использовать
preg_match_all
в PHP, и я попытался повторить его функциональность здесь:источник
/g
противном случае выполнениеexec()
не изменит текущий индекс и зациклится навсегда.Установите
g
модификатор для глобального соответствия:источник
Источник:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec
Поиск последовательных матчей
Если ваше регулярное выражение использует флаг "g", вы можете использовать метод exec () несколько раз, чтобы найти последовательные совпадения в одной и той же строке. Когда вы это делаете, поиск начинается с подстроки str, указанной в свойстве регулярного выражения lastIndex (test () также опережает свойство lastIndex). Например, предположим, что у вас есть этот скрипт:
Этот скрипт отображает следующий текст:
Примечание. Не помещайте литерал регулярного выражения (или конструктор RegExp) в условие while, иначе он создаст бесконечный цикл при совпадении из-за того, что свойство lastIndex сбрасывается при каждой итерации. Также убедитесь, что установлен глобальный флаг или здесь также произойдет цикл.
источник
String.prototype.match
сg
флагом:'abbcdefabh'.match(/ab*/g)
возврат['abb', 'ab']
Если кому-то (как и мне) нужен метод Томалака с поддержкой массивов (т.е. множественный выбор), вот он:
вход
?my=1&my=2&my=things
результат
1,2,things
(ранее возвращалось только: вещи)источник
Просто для того, чтобы придерживаться предложенного вопроса, как указано в заголовке, вы можете фактически перебирать каждое совпадение в строке, используя
String.prototype.replace()
. Например, следующее делает именно это, чтобы получить массив всех слов на основе регулярного выражения:Если бы я хотел получить группы захвата или даже индекс каждого матча, я мог бы сделать это тоже. Ниже показано, как возвращается каждое совпадение с полным совпадением, 1-й группой захвата и индексом:
После запуска вышеперечисленного,
words
будет сделано следующее:Чтобы сопоставить несколько вхождений, похожих на то, что доступно в PHP,
preg_match_all
вы можете использовать этот тип мышления для создания своего или использовать что-то подобноеYourJS.matchAll()
. YourJS более или менее определяет эту функцию следующим образом:источник
YourJS.parseQS()
( yourjs.com/snippets/56 ), хотя многие другие библиотеки также предлагают эту функцию.Если вы можете обойтись без использования,
map
это решение из четырех строк:Это не красиво, не эффективно, но, по крайней мере, оно компактно. ;)
источник
Используйте
window.URL
:источник
Привет с 2020 года. Позвольте мне представить String.prototype.matchAll () вашему вниманию:
Выходы:
источник
Чтобы захватить несколько параметров с использованием одного и того же имени, я изменил цикл while в методе Томалака следующим образом:
вход:
?firstname=george&lastname=bush&firstname=bill&lastname=clinton
возвращает:
{firstname : ["george", "bill"], lastname : ["bush", "clinton"]}
источник
?cinema=1234&film=12&film=34
я и ожидал{cinema: 1234, film: [12, 34]}
. Отредактировал ваш ответ, чтобы отразить это.Ну ... у меня была похожая проблема ... Я хочу пошаговый поиск с помощью RegExp (например: начать поиск ... выполнить некоторую обработку ... продолжить поиск до последнего соответствия)
После большого количества интернет-поиска ... как всегда (это становится привычкой), я оказался в StackOverflow и нашел ответ ...
На что не ссылаются и что стоит упомянуть, так это "
lastIndex
" Теперь я понимаю, почему объект RegExp реализуетlastIndex
свойство " "источник
Разделение это выглядит как лучший вариант для меня:
источник
Чтобы избежать регулярного выражения ада, вы можете найти свой первый матч, отрубите кусок и попытайтесь найти следующий в подстроке. В C # это выглядит примерно так, извините, я не перенес это на JavaScript для вас.
источник