【问题标题】:Regex Negative Lookahead using group defined earlier in match使用前面在匹配中定义的组的正则表达式负前瞻
【发布时间】:2018-09-10 19:37:01
【问题描述】:

我正在尝试编写一个正则表达式来解析由我们的数百个路由器生成的日志文件。该日志是一个脚本,它尝试 ping 环境中的每个其他路由器。这是为了合规,以证明我们无法 ping 环境中的其他每个路由器。日志看起来类似于以下摘录(只是大得多)。

Interface Name = INTNET1
IP Address                     =   192.168.200.200,

---PING Section---
PING 192.168.200.200: 56 data bytes
64 bytes from 192.168.200.200: icmp_seq=0. time=0. ms
64 bytes from 192.168.200.200: icmp_seq=1. time=0. ms
----192.168.200.200 PING Statistics----
2 packets transmitted, 2 packets received, 0% packet loss
round-trip (ms)  min/avg/max = 0/0/0
no answer from 192.168.12.13
no answer from 192.168.151.1
no answer from 192.168.19.1
no answer from 192.168.84.1
64 bytes from 192.168.100.100: icmp_seq=0. time=0. ms
64 bytes from 192.168.100.100: icmp_seq=1. time=0. ms
----192.168.100.100 PING Statistics----
2 packets transmitted, 2 packets received, 0% packet loss
round-trip (ms)  min/avg/max = 0/0/0

因为脚本中列出了所有路由器,所以每个路由器都会 ping 自己并收到肯定的回复。使用它来收集路由器的管理。知识产权:

IP\sAddress\s*\=\s*(?<MGMTIP>.*)

我想通过以下模式(PING 统计行)的匹配项进行负前瞻

\-\-\-\-(.*)\-\-\-\-

并且仅当地址与命名组不匹配时才匹配。 我已经破解了一段时间,但似乎无法让它工作。

编辑: 我想知道我是否过于复杂了。在整个字符串块中,我真正需要的只是匹配具有此模式的任何行:

\-\-\-\-(.*)\-\-\-\-

但仅在与此模式中的第 1 组不匹配时才捕获“(.*)”部分(与发出 ping 的主机的 IP 地址匹配)

IP\sAddress\s*\=\s*(.*)

【问题讨论】:

  • 根据您发布的输入,您能否举一个预期输出的示例?
  • 当然。我只想在具有“----a.b.c.d PING Statistics----”的任何行上获取与命名组“MGMTIP”不匹配的所有IP地址

标签: regex regex-negation


【解决方案1】:

我不确定您使用的是什么语言,所以我无法给出确切的答案,但这对于单个模式来说确实很难做到,所以我建议使用 2。您编写的第一个模式将捕获您的知识产权。

IP\sAddress\s*\=\s*(?&lt;MGMTIP&gt;.*)

我们会将它保存到一个名为“myIP”的变量中(如果您真的担心准确性,您会希望转义“myIP”中的每个.,因为使用正则表达式. 匹配任何字符。机会是不过这无关紧要)

你的下一个模式应该是"(?s)----" + myIP + "\sPING\sStatistics----.*?(?=----\d+\.\d+\.\d+\.\d+\sPING\sStatistics----|\Z)"

这将匹配您想要的每个部分。您可以将任何匹配项替换为 "",它会为您留下您正在寻找的所有部分。

Demo

【讨论】:

  • 它用于 Tripwire Enterprise 部署,它使用 java(我在 regex101.com 上用 pcre 建模我的东西)
  • 所以对于java来说,使用string.matches()捕获IP,使用string.replaceAll()删除不需要的部分。
  • 我想我忘了包括一些重要信息。此正则表达式未在脚本或代码中使用; Tripwire 只允许您使用正则表达式作为过滤器;因此,您需要一段文本,并且必须将其缩减为所需的结果。我承认这里有点菜鸟主义,如果我问你如何在代码示例中使用这 2 位的示例,请原谅我。
  • 那么由于过滤器规范,您绝对需要这种模式吗?
  • 这样的模式可能会涉及递归,天知道还有什么。它超出了我的范围。您可能想与Wiktor Stribiżew 核对。他是个正则表达式向导。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
相关资源
最近更新 更多