正则表达式解析HTTP请求的内容

时间:2015-12-11 18:29:56

标签: java regex

我试图匹配这些字符序列:

sender=11&receiver=2&subject=3&message=4
sender=AOFJOIA&receiver=p2308u48302rf0&subject=(@#UROJ)(J#OFN:&message=aoefhoa348!!!

(key,val)对之间的分隔符是'&'字符。 我想以一种可以访问密钥和每对价值的方式对它们进行分组。

我尝试过类似的事情:

([[:alnum:]]+)=([[:alnum:]]+)

然后我想念:

subject=(@#UROJ)(J#OFN:

我无法找到允许接受这些类型字符的方法。 更具体地说,如果有n对键值,我希望有n个匹配,每个匹配2个组 - 1个用于键,1个用于值。

如果你帮我解决这个问题,我很高兴。

谢谢

3 个答案:

答案 0 :(得分:1)

https://regex101.com/r/hN7qG9/1

我想这会解决你的问题:

  

/([?^ =&安培;] +)(=([^&安培;] *))?/ IG

<强>输出:

  

sender = 11
  接收器= 2
  subject = 3
  消息= 4
  发件人= AOFJOIA
  接收机= p2308u48302rf0
  受试者=(@#UROJ)(J#OFN:
  消息= aoefhoa348 !!!

你可以接受每一个模式:

current_string

reference

&#13;
&#13;
func(2,4,'bca')
&#13;
 $1 - first pattern (sender)
 $2 - second pattern (=11)
 $3 - second pattern without '='(11)
&#13;
&#13;
&#13;

答案 1 :(得分:0)

示例中的所有特殊字符都会在“标点符号”组中出现,请参阅:

https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

如果仍然不够,您可以尝试制作自己的角色正则表达式类。喜欢[@#etc ...]。请记住,您必须使用额外的/.

来转义特殊的java字符

答案 2 :(得分:0)

    String req = "sender=AOFJOIA&receiver=p2308u48302rf0&subject=(@#UROJ)(J#OFN:&message=aoefhoa348!!!";
    Pattern p = Pattern.compile("([\\w]+)=([^&]+)");
    Matcher m = p.matcher(req);

    while (m.find()){
        System.out.println("key = " + m.group(1)); // key
        System.out.println("value = " + m.group(2)); // value
    }

您应该为键/值对的“值”组定义自己的字符类。 例如,它可能是[\w!"#$%'()*+,-./:;<=>?@[]^_`{|}~][\w@()#:!]或简单如下:[^&]。 我认为[^&]字符类是最合适的,因为你不知道所有可能属于“值”部分的字符。