2017-02-05 5 views
-1

次のデータに対してPerl正規表現を書くにはどうすればよいですか?列の説明を解析するための正規表現

OID             NOT NULL INTEGER 
ACCT_TYPE            NOT NULL INTEGER 
NAME             NULL  VARCHAR 
PAST_DUE_90           NULL  INTEGER 

私は3つの別々の列に解析したいと思います。すべての空白スペースはスペースです。 2番目の列が2つの単語または1つを持つことができるという事実は、それを難し​​くします。各行の末尾には末尾にスペースがあることに注意してください。

私が試した最後のものは、このでした:https://regex101.com/r/6beMrM/1が、私は実際のコードでそれを実行するとcolsundefです:正規表現は、ここで働くことを

my ($col1, $col2, $col3) = $line =~ /^(\S+)\s+\b(.+) \b(\S+)\s*$/; 

ソルブード 各ファイル行には気付いていない先行スペースがありました。

+0

は常に二列です'NULL'か' NOT NULL'ですか? – Toto

+0

私は確かに分かりません。 23種類のデータがあります。したがって、その解決策は一般化されるべきです。 – StevieD

+3

正規表現が単独で動作し、実際のコードでは動作しない場合、なぜコードの代わりに正規表現を表示していますか? [mcve]してください。 – melpomene

答えて

2

のようなものが動作するはずです:

my ($col1, $col2, $col3) = $line =~ /^\s*(\w+)\s+((?:\w+)?\w+)\s+(\w+)\s*$/; 
+0

ええと、すべての列はまだ未定です。 – StevieD

+0

ああ、問題が見つかりました。私が気づいていなかった各行には、先頭に空白がありました。 – StevieD

+0

@StevieD:正規表現の前に '\ s *'を追加するだけです。私の編集を参照してください。 – Toto

2

あなたのパターンは私のためにundefを与えるものではありませんが、NULL/NOT NULLの部分は、それの周りにいくつかの空白がありました。 私は少しそれを変更し、望ましい結果を得た:

#!/usr/bin/env perl 

use strict; 
use warnings; 

while(my $line = <DATA>) { 
    my ($col1, $col2, $col3) = $line =~ /^\s*(\S+)\s+(.+?)\s+(\S+)\s*$/; 
    print "col1: [$col1], col2: [$col2], col3: [$col3]\n"; 
} 

__DATA__ 
OID             NOT NULL INTEGER 
ACCT_TYPE            NOT NULL INTEGER 
NAME             NULL  VARCHAR 
PAST_DUE_90           NULL  INTEGER 

出力:

col1: [OID], col2: [NOT NULL], col3: [INTEGER] 
col1: [ACCT_TYPE], col2: [NOT NULL], col3: [INTEGER] 
col1: [NAME], col2: [NULL], col3: [VARCHAR] 
col1: [PAST_DUE_90], col2: [NULL], col3: [INTEGER] 

ただ、参考のために:あなたのパターンが与えた:

col1: [OID], col2: [NOT NULL], col3: [INTEGER] 
col1: [ACCT_TYPE], col2: [NOT NULL], col3: [INTEGER] 
col1: [NAME], col2: [NULL ], col3: [VARCHAR] 
col1: [PAST_DUE_90], col2: [NULL ], col3: [INTEGER]