我根据以下规则编写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
答案 0 :(得分:1)
以下是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]?)$
答案 1 :(得分:0)
perl -e '$v=quotemeta($ENV{IP});print if /$v\.(?:1?\d?\d|2[0-4][0-9]|25[0-5])(?!\d)/?1:0'