2017-02-23 220 views
0

У меня есть строка в формате запроса URL:Извлечение параметров имен в URL запроса

string <- "key1=value1&key2=value2" 

И я хотел бы, чтобы извлечь все имена параметров (key1, key2).

Я думал о strsplit с разделом, соответствующим всем между = и опционным &.

unlist(strsplit(string, "=.+&?")) 
[1] "key1" 

Но я думаю, что этот шаблон совпадает с первой = до конца строки, включая в .+ моей опциональной &. Я подозреваю, что это из-за «жадности» регулярного выражения, поэтому я попытался сделать ленивый, но у меня получился странный результат.

> unlist(strsplit(string, "=.+?&?")) 
[1] "key1"  "alue1&key2" "alue2" 

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

Я знаю (и, я думаю, я также понимаю, почему), что он работает, если я исключаю & из .+, но мне хотелось бы понять, почему regexp выше не работает.

> unlist(strsplit(string, "=[^&]+&?")) 
[1] "key1" "key2" 

Мой фактический вариант, чтобы сделать это в 2 раза с:

unlist(sapply(unlist(strsplit(string, "&")), strsplit, split = "=.*", USE.NAMES = FALSE)) 

Что я делаю неправильно, чтобы добиться этого в одном регулярном выражении? Спасибо за любую помощь.

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

+0

Сплите аргумент должен описывать разделитель, а не формат частей, которые вы хотите получить. – Aaron

+1

Если вы хотите извлечь параметры URL-адреса, вы можете посмотреть пакет 'urltools'. Он может иметь то, что вам нужно. Если ваша цель состоит в том, чтобы учиться регулярному выражению, во что бы то ни стало, продолжайте учиться – GGamba

+0

Релевантный/Возможный дублированный http://stackoverflow.com/questions/4350440/split-a-column-of-a-data-frame-to-multiple- столбцы – zx8754

ответ

0

Для этой цели (URL разборе) лучший подход, как представляется, shiny::parseQueryString, как @nrussell предложил

shiny::parseQueryString("key1=value1&key2=value2")

enter image description here

0

Ваше первое выражение не работает, потому что по умолчанию кванторы являются жадными. Вот почему .+ будет соответствовать как можно больше. Почему &? не соответствует чему-либо, будет объяснено в следующем разделе.

Что случилось со вторым и более запутанным выражением?

Давайте посмотрим, что вы делаете.

unlist (strsplit (строка "=. +? &?")) [1] "key1" "alue1 & key2" "alue2"

Вы распределяете =v, но почему? Потому что вы пытаетесь сделать это ленивым, но что это значит?

? Делает предыдущий квантор ленивым, заставляя его соответствовать как можно меньше символов.

Наименьшее количество характер ваших регулярных выражений матчи:

= (жесткий характер)

+.? (один или более любых символов)

наименьшее количество возможных совпадений здесь есть один символ, который приводит к v

&? (если этот персонаж существует сопоставьте его тоже)

, так как предыдущее выражение соответствует только один символ, символ после v не &, который вызывает это регулярное выражение к сбою