【问题标题】:Regex is not working extracting key value pairs正则表达式无法提取键值对
【发布时间】:2014-09-01 00:20:03
【问题描述】:

我需要创建一个包含键值对的字典,基于以下字符串作为示例(youtube info_videos):

status=ok&use_cipher_signature=False&allow_ratings=1&iurlmaxres=http%3A%2F%2Fi.ytimg.com%2Fvi%2F5MwJobjESqw%2Fmaxresdefault.jpg&allow_embed=1&watermark=%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 中的正则表达式需要帮助。

【问题讨论】:

  • 你想捕捉什么?
  • 你最好在 &amp; 上拆分,然后在 = 上拆分。

标签: java regex dictionary youtube


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    开头没有 ^ 可能会更容易一些:

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

    Demo

    【讨论】:

      【解决方案3】:

      我想你想要这样的东西,

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

      DEMO

      上述正则表达式将在两个单独的组中捕获键值对。它假定,键前面必须有 &amp; 符号,值后面必须有 &amp; 或行尾锚。使用前瞻检查该值后面是&amp; 还是$

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

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

      DEMO

      【讨论】:

        【解决方案4】:
        (.*?)=(.*?)(?=(?:&)|($))&?
        

        你可以用这个。

        查看演示。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多