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。
我两天前正在测试这个问题。你能帮我吗?
答案 0 :(得分:1)
这将匹配第一个ID:
action \S+" (\d+)
从比赛中获得第1组
答案 1 :(得分:1)
试试这个:
(?<=GET\s).*?([^/\"]*).action
或使用此
([^/\"]*).action.*?([^/\"]*).action
并获得第1组。
说明:
*?
匹配前一个元素零次或多次,但次数尽可能少。(?<=subexpression)
零宽度正面观察断言。
答案 2 :(得分:0)
如果我正确理解了您的问题,那么您的问题是字符串中有两个“操作ID”,并且您希望同时捕获它们。但是,根据您评估此正则表达式的方式,您当前的正则表达式与两者都匹配,您可能只获得第一个匹配项。因此,为了通过一次匹配来提取两者,您需要重复正则表达式,然后使用要捕获的部分之间的所有内容:
([^/\"]*).action.*([^/\"]*).action
这是你的正则表达式([^/\"]*).action
,重复两次,中间有.*
,无限次匹配任何内容。然后,在捕获第一组和第二组时,这两个操作都可用。
答案 3 :(得分:0)