perl提取字符串和科学数字

时间:2018-05-30 18:47:41

标签: perl

我有特定格式的数据。

电容器#(。c( 3.58782e-14 )) c_1310 vsub vss_res );

我想从数据集中提取BOLD中突出显示的那些。我尝试使用正则表达式

$cap = $line =~ /([0-9]*\.?[0-9]+([eE][-]?[0-9]+)?)/ ;
($net1, $net2) = $line =~ /\(([A-Za-z0-9_]*) \, ([A-Za-z0-9_]*)\)/ ;

$ line包含每个数据行。需要帮助才能更正正则表达式。

我有一个使用split()函数的解决方案,但我认为正则表达式会更好。

2 个答案:

答案 0 :(得分:0)

假设数据的格式总是相同的,那么这样的事情应该起作用

my $line = 'capacitor #(.c(3.58782e-14)) c_1310 (vsub, vss_res);';
my ($net1, $net2, $net3) = $line =~ /\(.+\((.+)\)\)\s+(.+)\s+\((.+)\)/;

答案 1 :(得分:0)

原帖似乎做了一些检查和验证(与匹配'。'匹配任何东西相比),我会在这里建议一个更有效的版本:

use Modern::Perl;

use Regexp::Common;

my $line = 'capacitor #(.c(3.58782e-14)) c_1310 (vsub, vss_res);';
my ($cap, $cap_no, $net1, $net2) = $line =~ /
    \([^(]+\( ($RE{num}{real}) \)\)
    \s+(\w+)\s+
    \(
        (\w*) ,\s*
        (\w*)
    \)
/x;

say "cap: $cap cap_no: $cap_no net1: $net1 net2: $net2";

输出:

cap: 3.58782e-14 cap_no: c_1310 net1: vsub net2: vss_res