如何为以下数据编写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但是当我在实际代码中运行它时,cols
为undef
。
解决 我没注意到每个文件行中都有一个前导空格。
答案 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]