0

我根据以下规则编写 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

4

2 回答 2

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]?)$
于 2013-05-09T09:22:53.817 回答
0
 perl -e '$v=quotemeta($ENV{IP});print if /$v\.(?:1?\d?\d|2[0-4][0-9]|25[0-5])(?!\d)/?1:0'
于 2013-05-09T09:24:08.400 回答