我写了一段Perl代码,按照下面的规则匹配IP地址:
仅匹配前三个八位位组,而四个八位位组必须是有效的 0-255 ,除该数字外或“.”不能在第一个八位位组之前存在 和数字或“。”也不能存在于四个八位字节之后
例子
export IP=100.187.34
应该匹配的 IP 示例
:100.187.34.12:.10
IP=100.187.34.100$
AAA100.187.34.199BBB
address:100.187.34.210+
不应匹配的 IP 示例
55.100.187.34.99
.100.187.34..
100.187.34.100.1
100.187.34.2100
1.100.187.34
100.187.34.1.1
所以这是我的代码(不符合我的规则):
echo [...]xxx.xxx.xxx.xxx[...] | perl -pe 'print if /(?<![\d.])\Q$ENV{IP}\E(?=\.(?:1?\d?\d|2[0-4][0-9]|25[0-5])(?!\d))/; '
问题是我的代码几乎匹配任何数字
请建议我需要在我的代码中修复什么以便仅根据规则匹配 IP
最佳答案
以下是 O'Reilly 的正则表达式手册中 IP 正则表达式匹配的一些示例:
检查 IP 地址的简单正则表达式:
^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$
用于检查 IP 地址的准确正则表达式:
^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}↵
(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
从较长文本中提取 IP 地址的简单正则表达式:
\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b
从较长文本中提取 IP 地址的准确正则表达式:
\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}↵
(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b
捕获 IP 地址的四个部分的简单正则表达式:
^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$
捕获 IP 地址的四个部分的准确正则表达式:
^(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]?)$
关于regex - perl 一行+正则表达式匹配部分单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16458180/