用于解析列描述的正则表达式

时间:2017-02-05 11:18:54

标签: regex perl

如何为以下数据编写Perl正则表达式?

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

我想把它分成三个单独的列。所有白人空间都是空间。第二列可以有两个单词或一个单词的事实使它变得棘手。请注意,每行末尾都有尾随空格。

我尝试的最后一件事是:

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

正则表达式在这里工作:https://regex101.com/r/6beMrM/1但是当我在实际代码中运行它时,colsundef

解决 我没注意到每个文件行中都有一个前导空格。

2 个答案:

答案 0 :(得分:2)

这样的事情应该有效:

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

答案 1 :(得分: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]