我有一个url查询格式的字符串:
string <- "key1=value1&key2=value2"
我想提取所有参数名称(key1
,key2
)。
我考虑过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,所以其他任何选项也会因我的知识而受到赞赏!
答案 0 :(得分:0)
你的第一个表达式不起作用,因为默认情况下,量词是贪婪的。这就是.+
尽可能匹配的原因。为什么&?
不匹配任何内容将在下一节中解释。
第二个更令人困惑的表达是什么?
让我们来看看你在做什么。
取消列表(strsplit(string,“=。+?&amp;?”)) [1]“key1”“alue1&amp; key2”“alue2”
你正在分裂=v
但是为什么?因为你试图让它变得懒惰,但这是什么意思?
?使前面的量词变得懒惰,使其与匹配为少 尽可能使用字符。
正则表达式匹配的字符数最少:
= (硬字符)
。+?(任何一个或多个角色)
此处最少的匹配是一个字符,结果为v
&amp;?(如果此字符存在,则匹配)
由于上一个表达式只匹配一个字符,v
之后的字符不是导致此正则表达式失败的&
答案 1 :(得分:0)