2013-05-27 46 views
1
10.177.116.76 - [email protected] [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

什麼語言是您使用? – Bohemian

+0

有'/ infovia/GA/ga004rp0002.action'由空白包圍,且有' 「https://tb-infovia.groupwide.net/infovia/ga/ga013rp0004.action?messageId=errors.Authentication.001」 ';如果你正在尋找第一個,不要用空格分隔你的搜索正則表達式,以便拿起第一個而不是第二個。 –

回答

0

如果我正確理解你的問題,你的問題是,有字符串中的兩個「動作ID」,並且要同時捕獲。然而,用你目前的正則表達式,兩者都符合,取決於你如何評估這個正則表達式,你可能只會得到第一場比賽。所以,爲了一個比賽同時抽取,你需要重複的正則表達式,然後消耗你想要捕捉的部分之間的一切:

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

這是你的正則表達式([^/\"]*).action,重複2次,.*在中間,它可以無限次地匹配任何東西。然後,這兩項行動都可用於捕獲第一組和第二組。

1

這將第一ID匹配:從比賽

action \S+" (\d+) 

獲取組1

1

試試這個:

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

或使用該

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

,並得到組1,

解釋:

*?匹配前面的元素零次或多次,但幾次越好。 (?<=subexpression)零寬度正向後插入。

0

如果你相信它會一直跟着HTTP,你可以使用一個前瞻:

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

Regular expression image

Edit live on Debuggex