网络接口匹配

时间:2012-01-30 22:34:23

标签: regex perl interface

我想要做的是给出一个字符串:

"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 个答案:

答案 0 :(得分:2)

一种方式:

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 :(得分:1)

你的正则表达式有几个问题 - 让我们一个一个地解决它们。

  1. ^字符在方括号外使用时表示“行的开头”。所以你已经告诉正则表达式引擎你正在寻找的东西是在输入字符串的最开头,这是不正确的。所以请将^取出来。
  2. 使用[a-z]你专门告诉引擎只查找小写字母。您可以将其更改为[A-Za-z]或在最后一个斜杠后添加i以使正则表达式不区分大小写。
  3. 你的第一个*没有意义 - 我认为你要做的就是把这样的东西放在它的位置:[a-z]*(意思是0或更多的字母) )。
  4. 所以应用所有这些更改,这是你的新正则表达式:

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

    该正则表达式将捕获GigabitEthernet1/13

    编辑:这是一个可以玩你的正则表达式的地方,看看它如何响应变化:

    http://rubular.com/r/lsucbd8E4J

答案 2 :(得分:1)

使用捕获组:

$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