我需要能够在日志文件中查找和替换 IP 地址等敏感数据,以便将它们发送给供应商以获得技术支持。
问题是日志文件还包含看起来像 ip 地址但有额外数字的版本号。
到目前为止我得到的正则表达式可以很好地获取 IP 地址:
(((25[0-5]){1,3}|(2[0-4]|(1\d|[1-9]|)\d)){1,3}\.?){4}
问题是它还会获取诸如版本号之类的东西,因此它也匹配诸如
1555.2655.3255.1594
之类的东西
我认为使用
{1,3}
会将其限制为最多 3 位数,但它不是那样工作的。
我正在使用 Powershell 来解析文件,下面是我正在处理的格式类型的模型:
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
如果 IP 可以与某些文本中的字母相邻,请使用负lookarounds设置边界。
例如。
(?<![\d.])
代表前面没有数字或点,在它之后(?![\d.])
代表后面没有.
(?<![\d.])(?:(?:[1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:[1-9]?\d|1\d\d|2[0-4]\d|25[0-5])(?![\d.])
如果 IP 由空格分隔,则模式可以缩短为:
(?<!\S)(?:(?:[1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.?\b){4}(?!\S)
这里使模式更短的噱头是使用 optional 点
\.?
并在每次 \b
重复(甚至在最后)之后使用 word boundary
{4}
强制它。在第一种情况下,不能使用此方法,因为例如在1.2.3.4abc
IP之后没有单词边界。
(?:[1-9]?\d|1\d\d|2[0-4]\d|25[0-5])
的相关部分匹配 0-255 源自范围在线生成器 的正则表达式(有点缩短)。 Stack Overflow 也有一个。
这可能对你有用。
(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})