如何编写正则匹配日志中IPv4地址并排除类IP格式版本号?
解决日志中IPv4地址精准匹配与替换问题
原正则问题分析
你当前使用的正则(((25[0-5]){1,3}|(2[0-4]|(1\d|[1-9]|)\d)){1,3}\.?){4}存在结构错误:
{1,3}被错误应用在段规则分组之外,导致单个段规则可重复1-3次(比如(25[0-5]){1,3}会匹配255255255这类超长字符串)- 未严格限制每个IP段长度为1-3位,也未校验段的合法性(比如
256、999这类非法IP段会被误匹配) - 未处理边界,可能导致部分匹配(比如从
15.26.32.1594中误截断出15.26.32.159)
正确的IPv4匹配正则
使用以下正则可精准匹配合法IPv4地址,同时排除段长超3位或非法的类IP字符串:
\b(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\b
正则说明
\b:单词边界,确保匹配的IP前后不是数字,避免误截断或匹配超长段的部分内容(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d):单个合法IP段规则,覆盖0-255的所有情况,严格限制长度为1-3位(?:...\.){3}:匹配前三个带点的段- 最后一个段不带点,确保是完整的4段结构
PowerShell替换示例
若需将匹配到的IPv4替换为[REDACTED_IP],可执行以下命令:
$logContent = Get-Content -Path "your-log-file.log" -Raw $redactedContent = $logContent -replace '\b(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\b', '[REDACTED_IP]' $redactedContent | Set-Content -Path "redacted-log-file.log"
测试验证
针对你提供的模拟日志:test 127.1.1.1test test 10.0.0.1 test test 172.28.69.77test test 15.26.32.159 test test 15.26.32.1594test test 1.26.3255.1594test test 1555.2655.3255.1594test 255.255.255.192 256.255.255.0 999.999.999.999
替换后结果:test [REDACTED_IP]test test [REDACTED_IP] test test [REDACTED_IP]test test [REDACTED_IP] test test 15.26.32.1594test test 1.26.3255.1594test test 1555.2655.3255.1594test [REDACTED_IP] 256.255.255.0 999.999.999.999
- 合法IP(如
127.1.1.1、10.0.0.1、255.255.255.192)被正确替换 - 超长段的类IP字符串(如
15.26.32.1594、1555.2655.3255.1594)未被匹配 - 非法IP段(如
256.255.255.0、999.999.999.999)未被匹配
内容的提问来源于stack exchange,提问作者BaldFeegle
相关产品推荐
相关产品推荐

