正则表达式将HTTP请求第一行与组

时间:2015-12-06 12:56:16

标签: java regex

我面临的情况是我可以获得两种HTTP请求: 使用参数,或不使用。

1. GET /index.html?x=1&y=2 HTTP/1.1
2. GET /index.html HTTP/1.1

我想将这两行划分为正则表达式组。 我有这个正则表达式字符串:

^(.+?)\s(\/.*)|((\/.*\?)(.+=.+)+)\sHTTP\/\d\.\d$

您可以更轻松地在此处看到此内容: https://regex101.com/r/rH4rL1/5

如您所见,我试图为每组参数设置一个组(x = 1是一组,y = 2是另一组)。

然而,正如你在regex101中所看到的那样,在' GET'之后的整行。被捕获到一个组。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

首先,我应该说Java或其他任何成熟的语言 有一个设施可以做到这一点,而不必自己滚动。 谷歌搜索java parse http get request出现了一些潜在客户。对于 在这篇文章的其余部分中,我假设您想要自己推出 无论什么原因。

好的,所以看起来你想要在群组中捕捉几件事。 首先是路径名,最后是协议,以及其间的任何查询字符串。它 看起来现有的正则表达式也会捕获GET,但那就是 不断,所以我不打扰。您可以根据需要添加它。

GET /index.html?x=1&y=2 HTTP/1.1
GET /index.html HTTP/1.1

英文:

  • 匹配GET和空白
  • 匹配并捕获路径名,直到我们点击?或空格
  • 可选择匹配?,然后捕获任何查询字符串,直到我们点击空白
  • 匹配和捕获协议

我不懂Java。这个正则表达式适用于Python3。你应该能够 翻译没有太多麻烦。

GET\s+([^?\s]+)((?:[?&][^&\s]+)*)\s+(HTTP/.*)

注意第二部分((?:[?&][^&\s]+)*)。外括号是 捕获并捕获整个查询字符串集,这必须是 后来被分成了&符号。内括号使用?:,a 导致它们无法捕获的扩展名。我不知道Java是否有 相似的东西。如果没有查询字符串,则中间项为 空字符串。