首页 > 解决方案 > perl 提取字符串和科学数字

问题描述

我有特定格式的数据。

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

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

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

$line 包含每个数据行。需要帮助来纠正正则表达式。

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

标签: perl

解决方案


原始帖子似乎做了一些检查和验证(与匹配任何内容的匹配“。”相反),我将在这里建议一个更验证的版本:

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

推荐阅读