You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则表达式从不同格式事件中提取首个IP地址

正则表达式优化方案

你的原始正则存在几个问题:重复的(?:For:\s)?(?:For:.+)?匹配逻辑冗余,末尾的强制逗号会导致最后一行(无逗号的IP行)匹配失败,且未考虑IP合法性验证(可选)。以下是针对需求优化后的两种方案:

方案1:基础匹配(假设日志中IP格式均合法)

使用该正则可快速提取目标IP,无需验证IP数值范围:

For:\s*(?:[^,]*,)?\s*\b(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\b

匹配逻辑解释:

  • For:\s*:匹配行首的For:标识及后续任意空白字符
  • (?:[^,]*,)?:可选匹配非逗号字符组成的字符串(如${nd:app://${namingDetails}.for.net.sh})及末尾逗号,处理IP前存在额外内容的场景
  • \s*:匹配IP地址前的任意空白字符
  • \b(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\b:捕获第一个出现的IP地址,单词边界\b避免匹配IP的部分片段

方案2:严格匹配(验证IP合法性)

如果需要确保提取的是0-255范围内的合法IP,可使用以下正则:

For:\s*(?:[^,]*,)?\s*\b((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))\b

匹配逻辑解释:

在方案1的基础上,将IP的每个段替换为验证数值范围的正则,确保每个段取值在0-255之间,避免匹配如999.999.999.999这类无效IP。

测试效果

针对你提供的日志行:

For: ${nd:app://${namingDetails}.for.net.sh}, 4.5.3.2, 23.200.06.110 V-
For: 10.10.21.17, 5.18.11.74, 23.36.3.22 V-
For: 23.3.39.1, 21.61.39.21 V-
For: 3.3.39.1 V-

两种方案均能准确捕获你期望的首个IP:

4.5.3.2
10.10.21.17
23.3.39.1
3.3.39.1

内容的提问来源于stack exchange,提问作者ak9092

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 10:15:33