【问题标题】:Regex for web extraction. Positive lookahead issues用于网络提取的正则表达式。积极的前瞻问题
【发布时间】:2015-06-10 22:53:37
【问题描述】:

以下是我正在使用的一些数据的示例。我已经阅读了许多涉及此主题的帖子,并在 regex101 上尝试了一段时间。

BotInfo[-]: Source IP:[10.1.1.100] Target Host:[CentOS70-1] Target OS:[CentOS
7.0] Description:[HTTP Connection Request] Details:[10.1.1.101 - - [28/May
/2013:12:24:08 +0000] "GET /math/html.mli HTTP/1.0" 404 3567 "-" "-" ] Phase:
[Access] Service:[WEB]

目标是拥有两个捕获组。一个用于标记(例如源 IP、目标主机、描述等),另一个用于包含在最外面方括号中的内容。

吸引我的是“最外层”,因为 Details 标签的内容中有方括号。

这是我目前在上述正则表达式方面的进展。我正在使用 /g 标志:

\s?([^:]+):\[(.*?(?=\]\s.*?:\[))\]

这可以处理除边缘情况之外的所有事情(它比需要的更复杂,因为我一直在尝试让边缘情况工作)。

我当前的前瞻(\]\s.*?:\[),在高层次上,是匹配结束左括号,然后匹配下一个标签。另一个问题是这在最后一场比赛中失败了,因为没有以下标签。


编辑:请求成功输出的示例。使用提供的数据,目标是让两个捕获组产生这些对:

MATCH 1
1.  `Source IP`
2.  `10.1.1.100`
MATCH 2
1.  `Target Host`
2.  `CentOS70-1`
MATCH 3
1.  `Target OS`
2.  `CentOS 7.0`
MATCH 4
1.  `Description`
2.  `HTTP Connection Request`
MATCH 5
1.  `Details`
2.  `10.1.1.101 - - [28/May/2013:12:24:08 +0000] "GET /math/html.mli HTTP/1.0" 404 3567 "-" "-" `
MATCH 6
1.  `Phase`
2.  `Access` 
MATCH 7
1.  `Service`
2.  `WEB`

【问题讨论】:

  • 你能给你的字符串样本部分的预期输出吗?例如Details:[10.1.1.101 - - [28/May/2013:12:24:08 +0000] "GET /math/html.mli HTTP/1.0" 404 3567 "-" "-" ]
  • @Tensibai 是的,我很抱歉,我的意思是详细信息:字段。我会编辑它。

标签: regex lookahead


【解决方案1】:

this answer 对嵌套模式的启发很大,我最终得到了这个带有Demo here 的正则表达式:

\s*([\w ]+):\s*(\[((?>[^[\]]+|(?2))*)\])

主要思想是尽可能重复括号的匹配(如果找到左括号或右括号,则用(?2)重复。您要查找的数据实际上在第一个和第三个捕获中组,第二个是用括号捕获以使递归正确发生。

正则表达式的详细信息:

  • \s* 匹配(并丢弃)字段前的所有空格
  • ([\w ]+):捕获字段名(都在:)之前
  • \s* 再次丢弃字段前的任何空格
  • (\[ 第二个捕获组的开始并匹配一个乱码[
  • ((?>[^[\]]+ 第三个捕获组的开始,原子匹配(阻止回溯以避免无限循环)应该匹配除括号之外的任何内容
  • |(?2))如果我们找到了一个括号,请尝试重新匹配整个第二组
  • *) 重复原子组 0 次或无限次,交替获取嵌套括号并结束第三个捕获组
  • \]) 我们的最后一个括号,用于匹配并结束用于原子匹配交替的第二个捕获组。

【讨论】:

  • 谢谢,这正是我想要的!除了阅读它们之外,我对原子捕获没有太多经验。重新匹配第二个捕获组很聪明。谢谢一百万。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多