Perl: регулярное выражение (совпадающее повторение)

У меня есть быстрый вопрос. Что я делаю неправильно в приведенном ниже коде:

#!/usr/bin/perl -w
use strict;
my $num = "12345";
print "$num \n" if $num =~ m/\d{1,3}/;

Поскольку мой номер состоит из 5 цифр, я надеялся, что вывод не должен ничего печатать, потому что оператор if ищет число, состоящее как минимум из 1 цифры и максимум из 3 цифр. Но мой скрипт выводит вывод, как показано ниже:

# perl num.pl 
12345 

Я неправильно понимаю приведенное выше регулярное выражение?

Спасибо.

ИЗМЕНИТЬ:

Итак, на самом деле я пытаюсь сопоставить IP-адрес, например строку. например я хочу сопоставить 11.222.3.444, но это не сработало с m/\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}/, поэтому я начал работать с одной строкой, содержащей только число, и, следовательно, затем разместил это в переполнении стека.

Если мне нужно поставить ^ ИЛИ $, то как мне их использовать, если я хочу сопоставить IP-адрес, например строку s, упомянутую выше.

Спасибо за ваше время.


person slayedbylucifer    schedule 07.09.2012    source источник
comment
Вам не хватает якорей. ^ и $.   -  person flesk    schedule 07.09.2012
comment
Для сопоставления IP-адресов рассмотрите возможность использования Regexp::Common: :net.   -  person Kenosis    schedule 07.09.2012
comment
вы забыли сбежать . Используйте \.   -  person jchips12    schedule 07.09.2012


Ответы (2)


Ваш perl-код говорит: «внутри строки $num вы можете найти строку, состоящую не менее чем из 1 символа и не более чем из 3 символов, состоящую только из цифр». Конечно, да.

То, что вы хотите, это

print "$num \n" if $num =~ m/^\d{1,3}$/;

Это означает, что «внутри строки $num, начинающейся с первого символа и заканчивающейся последним символом, есть строка длиной не менее 1 символа и не более 3 символов, состоящая только из цифр».

Если вы пытаетесь найти что-то вроде IP-адреса, регулярное выражение для соответствия IP-адресу является хорошим обсуждением как это сделать.

person Michelle Six    schedule 07.09.2012
comment
Спасибо за ваше время, Мишель. Не могли бы вы просмотреть EDIT, который я сделал в своем исходном сообщении, и направить меня соответствующим образом. Спасибо. - person slayedbylucifer; 07.09.2012
comment
Этот, кажется, работает нормально: m/^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$/ - person slayedbylucifer; 07.09.2012

Приведенный ниже код проверяет правильность IP-адреса. Рассмотренные проверки перечислены ниже. 1) Если длина любой части IP-адреса, разделенной десятичным знаком, составляет более одной цифры, то она не должна начинаться с нуля. 2) Первый IP-адрес, разделенный десятичной дробью, не может быть равен нулю. 3) Любая часть IP-адреса, разделенная десятичным знаком, не может быть больше 255.

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

print "Enter the IP address : ";
$ip = <stdin>;
if($ip =~ /^([3-9]\d?|1\d?\d?|2([0-4]?\d?|5[0-5]|[6-9]?))(\.(0|[3-9]\d?|(1\d?\d?|2([0-4]?\d?|5[0-5]|[6-9]?)))){3}$/) {
    print "Correct\n";
}
else {
    print "Wrong\n";
}
person Kamleein    schedule 26.03.2014
comment
Вы пробовали? Например, это соответствует 9558.7506.5556.4545. - person Toto; 26.03.2014
comment
Да, я пробовал... ниже приведен результат, который я получаю при выполнении кода с вашим входным значением. $ perl ip.pl Введите IP-адрес: 9558.7506.5556.4545 Неправильно - person Kamleein; 26.03.2014
comment
Да, вы правы для этого, но он подтверждает 955.955.955.955. - person Toto; 26.03.2014
comment
Привет M42, Спасибо за ваш отзыв. Ну, я изменил регулярное выражение выше. Теперь вроде хорошо. Буду рад улучшить его, если будут получены дополнительные комментарии. - person Kamleein; 26.03.2014
comment
Регулярное выражение было изменено. Пожалуйста, дайте мне знать, если это будет полезно. Эксперты, пожалуйста, сделайте обзор и дайте мне знать, как это можно сделать более понятным. - person Kamleein; 26.03.2014
comment
@ M42 - изменили регулярное выражение со ссылкой на предоставленную ссылку, спасибо. Проблема с предоставленной ссылкой заключается в том, что IP-адрес 1.1.1.01 недействителен, но он успешно соответствует этой ссылке. - person Kamleein; 26.03.2014