Соответствие сетевого интерфейса - PullRequest
0 голосов
/ 31 января 2012

Я пытаюсь получить строку типа:

"hello GigabitEthernet1/13 mplampla"

для извлечения интерфейса, например:

"GigabitEthernet1/13"

и для извлечения первых 2 символов, а затемномер интерфейса, например:

"Gi1/13"

Что я делаю не так?

#!/usr/bin/perl     -w

use     strict ;
use     warnings ;

my $string = "hello GigabitEthernet1/13 mplampla" ;
$string =~ /(^[a-z]{2}*[0-9]\/*[0-9]*\/*[0-9]*)/ ;
print $string."\n" ;

PS.номер интерфейса может быть как «Po4», «TenGigabitEthernet2/0/0.13» и т. д.

Ответы [ 3 ]

2 голосов
/ 31 января 2012

В одну сторону:

use     strict ;
use     warnings ;

my $string = "hello GigabitEthernet1/13 mplampla" ;
my @result = $string =~ /\s(\w{2})(?:\D*)(\d+\S*)/;
{
    local $" = qq[];
    print qq[@result\n];
}

Регулярное выражение:

\s                        # A space character.
(\w{2})                   # Two alphabetic characters. Save as group 1.
(?:\D*)                   # Any no-numeric characters. No save them.
(\d+\S*)                  # From first digit found until a space. Save as group 2.

Для печати:

$"                  # It is the separator for array elements. It is set to a blank.
@result             # It is an array with grouped elements of the regular expression.
1 голос
/ 31 января 2012

Использовать группы захвата:

$string =~ s|
        ^.*            # match beginning text (to be replaced)
        \b(\w{2})\w+   # capture the first two letters (in $1)
        (
          (?: \d+/? )+ # and one or more digits followed by 0 or 1 slashes,
                       # one or more times (in $2)
        )
        .*$            # match ending text (to be replaced)

    |$1$2|x;  # replace with only the contents of the capture groups
1 голос
/ 31 января 2012

В вашем регулярном выражении есть несколько ошибок - давайте разберемся с ними один за другим.

  1. Символ ^ при использовании вне квадратных скобок означает «начало строки»,Итак, вы сказали движку регулярных выражений, что искомая вещь находится в самом начале строки ввода, что не соответствует действительности.Так что уберите ^.
  2. Используя [a-z], вы специально указали движку только искать строчные буквы.Вы можете изменить его на [A-Za-z] или добавить i после последней косой черты, чтобы сделать регулярное выражение нечувствительным к регистру.
  3. То, что у вас есть *, не имеет смысла, где оно находится -Я думаю, что вы хотели сделать, это поставить что-то вроде этого на место: [a-z]* (что означает 0 или более букв).

Итак, применяя все эти изменения, вот ваше новое регулярное выражение:

/([a-z]{2}[a-z]*[0-9]\/*[0-9]*\/*[0-9]*)/i

Это регулярное выражение захватит GigabitEthernet1/13.

Редактировать: Это место, где вы можете поиграть с вашим регулярным выражением и посмотреть, как оно реагирует на изменения:

http://rubular.com/r/lsucbd8E4J

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...