如何创建一个正则表达式来捕获 IP 地址后跟与该 IP 地址关联的值?

How to create a regex which captures the IP addresses followed by a value associated with that IP address?

我是运行一组节点上的脚本作业,与该作业关联的日志为我提供了我试图用正则表达式解析的数据字符串。我尝试从我的 link 此处 https://regex101.com/r/jX9hW8/2 中提取所有成功率为 0% 的节点的 IP 地址。我想要得到的结果是

10.0.0.183
Success rate is 0 percent

如果我尝试列出我尝试过的所有内容,我会在这里呆上一整天,但似乎我得到的只是括号中的任何数字。

你可以使用

'~^\s*D\d+\.node\s+\(([\d.]+)\):(?:(?!^\s*(?:D\d+\.node|Success rate is)\s).)*^\s*Success rate is 0\b~ms'

regex demo

我们的想法是使用匹配除前导和尾随定界符以外的任何文本的缓和贪婪标记。

  • ^\s*D\d+\.node\s+\(([\d.]+)\): - 前导分隔符,匹配:

    • ^ - 行首
    • \s* - 0+ 个空格
    • D - 文字 D
    • \d+ - 1+ 位数
    • \.node - 非文字字符串 .node
    • \s+ - 1+ 个空格
    • \( - 一个(
    • ([\d.]+) - 第 1 组匹配 1+ 个数字或文字点
    • \): - 文字 ):
  • ^\s*Success rate is 0\b - 尾部分隔符匹配

    • ^ - 行首
    • \s* - 0+ 个空格
    • Success rate is 0\b - 一个字符序列 Success rate is 0 作为一个完整的单词匹配(\b 阻止匹配 03,例如)

(?:(?!^\s*(?:D\d+\.node|Success rate is)\s).)* 是匹配任何字符(. 将匹配任何字符)的 tempered greedy token,它不是以下序列的起始字符: - ^\s* - 行首后跟 0+ 个空格 - (?:D\d+\.node - D 后跟 1+ 位数字后跟 .node - | - 或 - Success rate is) - 文字字符串 Success rate is - \s - 空格