正则表达式模式提取日志

时间:2013-05-27 02:29:51

标签: regex

10.177.116.76 - U031503@nttdata [11/Mar/2013:09:42:44 +0900] "GET /infovia/ga/ga004rp0002.action HTTP/1.1" 302 301 "https://tb-infovia.groupwide.net/infovia/ga/ga013rp0004.action?messageId=errors.Authentication.001" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET CLR 1.1.4322)"

以上是访问日志行。有两个动作ID。 我想通过使用正则表达式模式在HTTP之前提取第一个操作ID。 现在我使用这种模式([^/\"]*).action。 它在任何地方都匹配了两个动作ID。 我两天前正在测试这个问题。你能帮我吗?

4 个答案:

答案 0 :(得分:1)

这将匹配第一个ID:

action \S+" (\d+)

从比赛中获得第1组

答案 1 :(得分:1)

试试这个:

(?<=GET\s).*?([^/\"]*).action

或使用此

([^/\"]*).action.*?([^/\"]*).action

并获得第1组。

说明:

  

*? 匹配前一个元素零次或多次,但次数尽可能少。    (?<=subexpression) 零宽度正面观察断言。

答案 2 :(得分:0)

如果我正确理解了您的问题,那么您的问题是字符串中有两个“操作ID”,并且您希望同时捕获它们。但是,根据您评估此正则表达式的方式,您当前的正则表达式与两者都匹配,您可能只获得第一个匹配项。因此,为了通过一次匹配来提取两者,您需要重复正则表达式,然后使用要捕获的部分之间的所有内容:

([^/\"]*).action.*([^/\"]*).action

这是你的正则表达式([^/\"]*).action,重复两次,中间有.*,无限次匹配任何内容。然后,在捕获第一组和第二组时,这两个操作都可用。

答案 3 :(得分:0)

如果您确定HTTP始终会跟着它,您可以使用前瞻:

([^/\"]*).action(?=\sHTTP)

Regular expression image

Edit live on Debuggex