正则表达式不工作提取键值对

时间:2014-09-01 00:20:04

标签: java regex dictionary youtube

我需要根据跟随字符串创建一个包含键值对的字典(youtube info_videos):

状态= OK&安培; use_cipher_signature =假&安培; allow_ratings = 1&安培; iurlmaxres = HTTP%3A%2F%2Fi.ytimg.com%2Fvi%2F5MwJobjESqw%2Fmaxresdefault.jpg&安培; allow_embed用于= 1&安培;水印=%2Chttp%3A%2F% 2Fs.ytimg.com%2Fyts%2Fimg%2Fwatermark%2Fyoutube_watermark-vflHX6b6E.png%2Chttp%3A%2F%2Fs.ytimg.com

问题是我的正则表达式不能一直运行:

String pattern = "&(.+?)=(.+?)&.+?";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(decodedUrl);
Multimap<String, String> map = HashMultimap.create();
while(m.find()) {            
    map.put(URLDecoder.decode(m.group(1), "UTF-8"), URLDecoder.decode(m.group(2), "UTF-8"));
}

我在java中需要帮助我的正则表达式。

4 个答案:

答案 0 :(得分:1)

您可以使用以下正则表达式。

(?:^|&)([^=]+)=([^&]+)

答案 1 :(得分:1)

我发现hwnd有最好的答案,因为像这样[^ =] +做一个否定更快,它避免使用懒惰的运算符。

如果没有^开头可能会有点容易:

&?([^=]+)=([^&]+)

Demo

答案 2 :(得分:0)

我想你想要这样的东西,

&(.+?)=(.+?)(?=&|$)

DEMO

上述正则表达式将捕获两个独立组中的键值对。假设一个密钥必须以&符号开头,并且该值必须后跟&或行锚点的结尾。使用前瞻检查值是否后跟&$

如果您想捕获第一个status=ok键值对,请尝试以下正则表达式,

(?<=&|^)(.+?)=(.+?)(?=&|$)

DEMO

答案 3 :(得分:0)

(.*?)=(.*?)(?=(?:&)|($))&?

你可以使用它。

参见演示。

http://regex101.com/r/iX8hF3/6