Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Поиск ip адреса в тексие


Автор: seventy 24.9.2006, 21:24
Имеется текст содержащий некоторое количество ип адресов, как при помощи рег выражений все эти адреса достать? 

Автор: nitr 24.9.2006, 23:15
=) самое простое
Код

#!perl
my $str = '1.2.3.4 ggg 1.2.3.4 hghg 5.6.7.8 ghg';
my $hash;
$hash->{$1} ++ while $str =~ /(\d+\.\d+\.\d+\.\d+)/smg;
#либо вывести
print join "\n", sort keys %$hash; 

#либо, конечно, можно в массив 
my @ip_list= sort keys %$hash;

Автор: DiverD 25.9.2006, 10:13
Это проще =))

Код

#!/usr/bin/perl
$a = 'Hello my subnet, my adress is 192.157.3.4 ellite adress';
$a =~ /(\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})/g;
print $1;

Автор: Danissimo 25.9.2006, 10:21
а так:
/(\d{1,3}(?:\.\d{1,3}){3})/g

Автор: nitr 25.9.2006, 10:41
Danissimo, так дольше! и ресурсов больше и НЕЧИТАБЕЛЬНО, можешь сам проверить, по каким причинам, я не выяснял, поэтому и не юзаю, ты бы такое указал

Автор: amg 25.9.2006, 11:53
А можно еще извратиться и дополнить проверкой на правильность (см. код nitr)
Код

$hash->{$1} ++ while $str =~ /(\d+\.\d+\.\d+\.\d+)/smg xor grep {$_>255} split /\./,$1;

Автор: DiverD 25.9.2006, 12:07
А еще вот так:

Код

#!/usr/bin/perl
$a = 'Hello my subnet, my adress is 192.157.3.4 ellite adress';
$b = '\d{1,3}.' x 4;
$a =~ /($b)/go;
print $1;


=))

Автор: Danissimo 25.9.2006, 12:08
nitr, чесно говоря не понял, задаешь ли ты вопрос. Если да, то я его не понял.

Я рассуждаю так: регулярные языки -- такие языки, которые могут быть распознаны конечным автоматом. Главное -- по регулярному выражению построить автомат. По регулярному выражению строится простейший автомат, более того, он линейный. Так что не вижу проблем.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)