以下输入的一个合并正则表达式

时间:2016-06-27 15:18:54

标签: regex perl

有人可以为下面的输入提供合并的正则表达式吗?

1. interface eth1/10.404 p2p 
2. interface ae0.100 p2p
3. interface pool0 multibind lastresort
4. interface loop0 loopback
5. interface ae0.100
6. interface loop0

我创建了一个,但它没有给我所需的输出:

/^\sinterface\s(((\w*\/*\w*.\w*)\s(\w*.*))|((\w*\/*\w*.\w*)))/

我需要的输出是从每个输入我收到的值为:

    • 第一组:eth1 / 10.404
    • 第二组:p2p
    • 第一组:ae0.100
    • 第二组:p2p
    • 第一组:pool0
    • 第二组:multibind lastresort
    • 第一组:loop0
    • 第二组:环回
    • 第一组:ae0.100
    • 第一组:loop0
  1. 以上正则表达式不适用于3个输入。

5 个答案:

答案 0 :(得分:2)

请勿正则表达式,请使用split

#!/usr/bin/perl
use strict;
use warnings;

while ( <DATA> ) { 
   chomp;
   next unless /interface/;
   my ( undef, undef, $if_name, $options ) = split / /, $_, 4;
   print "$if_name => ",$options // '(none)',"\n";
}

__DATA__
1. interface eth1/10.404 p2p 
2. interface ae0.100 p2p
3. interface pool0 multibind lastresort
4. interface loop0 loopback
5. interface ae0.100
6. interface loop0

使用//这是'已定义'条件,返回值或字符串'(none)'。

输出:

eth1/10.404 => p2p 
ae0.100 => p2p
pool0 => multibind lastresort
loop0 => loopback
ae0.100 => (none)
loop0 => (none)

答案 1 :(得分:0)

试试这个:

#!/usr/bin/perl
while(<>) {
    next unless m{interface\s+(\S+)(\s+(.+))?\s*$};
    print "1st group:-$1";
    print " 2nd group:-$3" if $3 ne '';
    print "\n";
}

答案 2 :(得分:0)

您有简单的空格分隔数据。看起来这可能是一个更容易的解决方案:

if ($line =~ /^interfaces/) {
    chomp($line);
    my @fields = split(/ /, $line, 3);

    # Use $fields[1], and use $fields[2] if it is defined.
    # Check with e.g., scalar(@fields) == 3
}

答案 3 :(得分:0)

试试这个:

^\s*interface\s(\S+)(.*)?

请参阅live demo

答案 4 :(得分:0)

这似乎对我有用:

interface(\s[\w\d\/.]+)(.*)?

演示here