2013-11-11 2 views
2

Я использую этот код, чтобы соответствовать IPMatching IP в Perl

$IP =~ /(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/; 

if ($1 < 256 && $2 < 256 && $3 < 256 && $4 < 256) { 
print "IP matched"; 
} 

Я не хочу использовать, если цикл. Есть ли способ, что мы можем сделать проверку (< 256) в регулярном выражении только

Я знаю, что есть еще один способ, как

/25[0-5]|2[0-4][0-9]|[01][0-9][0-9]?/ 

Является ли другой ярлык способ

+0

И почему у вас есть это странное требование? – Vijay

+0

@Vijay: Просто пытаюсь. Кто-то спросил меня несколько дней назад о регулярном выражении для IP без цикла «if». – Nitesh

ответ

2

Посмотрите на @ysth ответ или вы можете хранить спички в массив:

my @m = grep $_ <256, $IP =~ /([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})/; 

if (@m == 4) { 
    print "IP matched"; 
} 
+0

Я пробовал свой код на '$ IP =" 5.8. ߂. ୪ ";' и получил кучу аргумента не числовые предупреждения :) Не используйте \ d, когда вы имеете в виду [0-9]. – ysth

+0

@ysth вы правы, но регулярное выражение вставлено из OP. –

+0

@mpapec: Это регулярное выражение, на которое я уже обращался. благодаря – Nitesh

1

Это не красиво, но как о чем-то вроде /^(1?\d{1,2}|2[0-4]\d|25[0-5])(\.(1?\d{1,2}|2[0-4]\d|25[0-5])){3}$/

+0

Или, может быть, ответ, который вы ищете, просто «нет». Нет волшебного способа, который я знаю, чтобы проверить размер числа в регулярном выражении. Но, как указывают другие плакаты, регулярное выражение - это не единственный способ сделать это в любом случае. – nicb

1

Я могу понять, что вы спрашиваете о регулярном выражении для проверки IP-адреса? Но почему бы вам не попробовать http://metacpan.org/pod/Data::Validate::IP вместо ручных подходов?

9
use Regexp::Common 'net'; 

if ($IP =~ /\A$RE{net}{IPv4}\z/) { 
    print "IP matched\n"; 
} 
0

Встроенный код может быть использован в качестве условия внутри регулярного выражения, и некоторые ветви могут быть сделаны, чтобы заставить откаты:

qr/ 
    # the string consists of nothing but 4 bytes separated by a period 
    \A (?&decimal_byte) (?: [.] (?&decimal_byte)){3} \z 

    (?(DEFINE) 
    (?<decimal_byte> 
     ([0-9]{1,3}+) # 1 to 3 digits without backtracking 
     (?(?{ $^N <= 0xFF }) | (*FAIL)) # (?(?{ COND }) YES | NO) 
    ) 
) 
/x 

$^N относится к last closed capture group. Обратите внимание, что оценка кода внутри регулярных выражений имеет последствия безопасности и что этот метод не переносится на другие двигатели регулярных выражений, такие как pcre.


  1. Если вы слепо интерполировать ненадежное регулярное выражение, он может выполнить произвольный код:

    my $malicious = '(?{ `rm -rf ~` })'; 
    
    say "You were pwned" if $foo =~ /something="$malicious"/; 
    

    Perl спасает вас от регулярных выражений ада безопасности, требуя, чтобы вы use re qw/eval/, если вы хотите, чтобы нести ответственность за regex security. Обратите внимание, что это необходимо, только если интерполяция запускает новую компиляцию: my $ok = qr/(?{ say "yes" })/; $foo =~ /$ok/ работает просто отлично.

Смежные вопросы