正则表达式 - 匹配HTTP Via标记

时间:2011-02-08 11:52:56

标签: regex

我在从客户端浏览器解析HTTP“Via”标记时遇到问题。 这是我得到的HTTP标头的一个例子:

GET / HTTP/1.0
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, */*
Accept-Language: sr-Latn-RS
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; MATM; AskTbGOM2/5.8.0.12304)
Accept-Encoding: gzip, deflate
Host: 10.0.1.7
Via: 1.1 smtp.local:3128 (squid/2.6.STABLE21)
X-Forwarded-For: 10.0.0.75
Cache-Control: max-age=259200
Connection: keep-alive

现在,我需要从此标题中获取smtp.local:3128部分,但我写的正则表达式不起作用。

用C#编写的示例模式(不起作用):

string matchHttpVia = @"Via: 1.1 (\.+:\d+)";

请注意,也可能有IP而不是主机名。

2 个答案:

答案 0 :(得分:2)

要解析 Via:x.x host:port ,您可以使用正则表达式:

Via: \d+\.\d+ (.*:\d+) (\(.*\))?

实际上这也应该足够了:

Via: \d+\.\d+ (.*:\d+)

这应该可以解决'版本',主机和端口的所有可能情况。

答案 1 :(得分:0)

正如Konerak评论的那样,删除点之前的反斜杠,给出Via: 1.1 (.*:\d+)应该可以解决您的问题。 \.仅匹配.匹配任何字符的文字点字符。

但请注意,只有在“Via:”和主机名/ IP之间出现“1.1”时,这才有效。我不太了解HTTP标头,知道这是否是一个安全的假设,但似乎可能不是。