【发布时间】:2009-08-26 19:35:51
【问题描述】:
我正在尝试设计 Perl 正则表达式来解析 IBM 的 runmqsc 实用程序的命令输出。
每一行感兴趣的输出都包含一个或多个属性/值对,格式为:“ATTRIBUTE(VALUE)”。属性的值可以为空,也可以包含括号本身。通常,在给定的行上最多出现两个属性/值对,因此正则表达式是在此假设下编写的。
Perl RE 的示例输入:
CHANNEL(TO.IPTWX01) CHLTYPE(CLUSRCVR)
DISCINT(6000) SHORTRTY(10)
TRPTYPE(TCP) DESCR( )
LONGTMR(1200) SCYEXIT( )
CONNAME(NODE(1414)) MREXIT( )
MREXIT( ) CONNAME2(SOME(1416))
TPNAME( ) BATCHSZ(50)
MCANAME( ) MODENAME( )
ALTTIME(00.41.56) SSLPEER()
CONTRIVED() ATTR (00-41-56)
CONTRIVED() DOCTORED()
MSGEXIT( )
我有以下 Perl 代码来捕获每个属性/值对。
Perl 代码
my $resplit = qr/\s+([^\s]+(?:\([^)]*\))?)\s?/;
while ( <IN2> )
{ s/[\s\r\n]+$//;
if ( m/^\s(?:$resplit)(?:$resplit)?$/ )
{ my ($one,$two) = ($1,$2);
print "one: $one, two: $two\n";
}
}
以下是将上述代码应用于示例输入时的输出:
一:CHANNEL(TO.IPTWX01),二:CHLTYPE(CLUSRCVR) 一:DISCINT(6000),二:SHORTY(10) 一:TRPTYPE(TCP),二:DESCR() 一:LONGTMR(1200),二:SCYEXIT() 一:CONNAME(NODE(1414)),二:MREXIT() 一:MREXIT( ),二:CONNAME2(SOME(1416)) 一:TPNAME( ),二:BATCHSZ(50) 一:MCANAME(),二:MODENAME() 一:ALTTIME(00.41.56),二:SSLPEER() 一:CONTRIVED(),二:ATTR(00-41-56) 一:做作(),二:医生() 一:MSGEXIT(,二:)这很好用,除了输出中的最后一行 多于。我真的很难弄清楚如何 修改上面的表达式 $resplit 以捕获最后一种情况。
任何人都可以就如何使这项工作提供任何想法/建议或 另一种方法?
【问题讨论】: