[英]Perl regular expression for partially matching an ip or mac address
我正在編寫一個優化程序,您在其中搜索我的應用程序,如果該字符串看起來像一個IP地址,那么就不用去搜索MAC地址了。 而且,如果搜索看起來像一個MAC地址,請不要在IP地址db列中打擾。
我見過與ips和mac地址完全匹配的表達式,但是很難匹配部分字符串和相當有趣的腦筋急轉彎,我想我會得到其他人的意見。 現在我有沒有正則表達式的解決方案。
use List::Util qw(first);
sub query_is_a_possible_mac_address {
my ($class, $possible_mac) = @_;
return 1 unless $possible_mac;
my @octets = split /:/, $possible_mac, -1;
return 0 if scalar @octets > 6; # fail long MACS
return 0 if (first { $_ !~ m/[^[:xdigit:]]$/ } @octets; # fail any non-hex characters
return not first { hex $_ > 2 ** 8 }; # fail if the number is too big
}
# valid tests
'12:34:56:78:90:12'
'88:11:'
'88:88:F0:0A:2B:BF'
'88'
':81'
':'
'12:34'
'12:34:'
'a'
''
# invalid tests
'88:88:F0:0A:2B:BF:00'
'88z'
'8888F00A2BBF00'
':81a'
'881'
' 88:1B'
'Z'
'z'
'a12:34'
' '
'::88:'
給定(新)測試,此方法有效:
/^[0-9A-Fa-f]{0,2}(:[0-9A-Fa-f]{2}){0,5}:?$/
以下是在上述測試中匹配的行(請注意,正確匹配了諸如“ a”和“ A”之類的單個十六進制字符:
12:34:56:78:90:12
88:11:
88:88:F0:0A:2B:BF
88
:81
:
12:34
12:34:
a
'' (<-- empty space)
我發現做到這一點的最好方法是嘗試使可能的匹配成為您要匹配的對象。 例如,如果您有一個字符串:1.2,請嘗試使其看起來像一個IP地址:1.2.1.1。 然后應用正則表達式
sub contains_ip {
my ($possible_ip) = @_;
my @splits = split /\./, $possible_ip;
return 0 if @splits > 4;
while (@splits < 4) {
push @splits, '1';
}
$possible_ip = join '.', @splits;
my ($match) = $possible_ip =~ m/^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/;
return defined $match ? 1 : 0;
}
warn contains_ip('1.2'); # 1
warn contains_ip('127.0.0.1'); # 1
warn contains_ip('1.2asd'); # 0
warn contains_ip('1.2.3.4.5'); # 0
同樣的事情也適用於mac地址:如果您有11:22,請嘗試使其看起來像是完全合格的mac地址11:22:00:00:00:00,然后將mac地址正則表達式應用於它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.