1
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

4 回答 4

1

尝试这个:

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

或使用这个

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

并获得第 1 组。

解释:

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

于 2013-05-27T04:08:35.123 回答
1

这将匹配第一个 id:

action \S+" (\d+)

从比赛中获得第 1 组

于 2013-05-27T02:45:58.507 回答
0

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

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

这是你的 regex ([^/\"]*).action,重复两次,.*中间有任何匹配次数。然后这两个动作都可用于捕获组一和二。

于 2013-05-27T02:39:27.897 回答
0

如果你确定它后面总是跟着HTTP,你可以使用前瞻:

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

正则表达式图片

在 Debuggex 上实时编辑

于 2013-05-27T15:55:31.840 回答