2016-06-27 5 views
1

誰かが下の入力のための統合された正規表現を与えることができますか?下の入力のための1つの統合された正規表現

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 

私は1つを作成しているが、私に所望の出力を与えるされていません。

    • :私は必要と出力は各入力から私のように値を受け取ることである

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

    • 第1グループ:eth1/10.404
    • 第2グループ:p2p
    • 第一グループ:P2P
    • 第一グループ:pool0
    • 第二グループ:multibindラストリゾート
    • 第二グループae0.100
    • 第1グループ:loop0
    • 第2群:ループバック
    • 第1群:
    • ae0.100第1群:loop0

上記の正規表現であります3つの入力に対しては機能しません。

+0

ご入力データの番号が付けられている、またはあなただけの例の番号が付いていますか? – Sobrique

答えて

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"; 
} 
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 
} 
0

はこれを試してみてください:

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

live demoを参照してください。これは簡単に解決策になるかもしれないように見えます。

1

正規表現、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 

は「(なし)」の値または文字列を返すように、「定義された」条件付きである//を使用します。

出力:

これは私のために働くようだ
eth1/10.404 => p2p 
ae0.100 => p2p 
pool0 => multibind lastresort 
loop0 => loopback 
ae0.100 => (none) 
loop0 => (none) 
関連する問題