Perl one liner +正则表达式匹配部分单词

时间:2013-05-09 09:07:52

标签: regex linux perl shell ksh

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

2 个答案:

答案 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'