在URL查询

时间:2017-02-23 11:52:23

标签: r regex

我有一个url查询格式的字符串:

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

我想提取所有参数名称(key1key2)。

我考虑过strsplit,其中的分组符合=和可选&之间的所有内容。

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

但我想这个模式从第一个=到字符串末尾匹配,包括&中的可选.+。我怀疑这是因为正则表达式的“贪婪”,所以我试着让它变懒,但我得到了一个奇怪的结果。

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

现在我真的不明白这里发生了什么,当最后一个匹配的字符是可选的时候,我不知道如何让它变得懒惰。

我知道(我想也明白为什么)如果我从&中排除.+,但我希望我能理解为什么上面的正则表达式不起作用。

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

我的实际选择是在以下情况下进行2次:

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

在一个正则表达式中实现这一点我做错了什么? 谢谢你的帮助。

我很痛苦地学习regexp,所以其他任何选项也会因我的知识而受到赞赏!

2 个答案:

答案 0 :(得分:0)

你的第一个表达式不起作用,因为默认情况下,量词是贪婪的。这就是.+尽可能匹配的原因。为什么&?不匹配任何内容将在下一节中解释。

第二个更令人困惑的表达是什么?

让我们来看看你在做什么。

  

取消列表(strsplit(string,“=。+?&amp;?”))   [1]“key1”“alue1&amp; key2”“alue2”

你正在分裂=v但是为什么?因为你试图让它变得懒惰,但这是什么意思?

  

?使前面的量词变得懒惰,使其与匹配为少   尽可能使用字符

正则表达式匹配的字符数最少:

= (硬字符)

。+?(任何一个或多个角色)

此处最少的匹配是一个字符,结果为v

&amp;?(如果此字符存在,则匹配)

由于上一个表达式只匹配一个字符,v之后的字符不是导致此正则表达式失败的&

答案 1 :(得分:0)

为此目的(url解析)最好的方法似乎是shiny::parseQueryString,因为@nrussell建议

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

enter image description here