如何通过关键词匹配最短的内容?

时间:2017-08-10 14:51:39

标签: regex perl

我是Perl初学者,我有以下问题

如何使用Perl正则表达式按关键词匹配最短内容? 例如:

my $txt='RMS Power                     :  [   0.00]>[   2.83]<[   4.00]dBm        [PASS]';

我希望得到以下结果:

$1: RMS Power
$2: 0.00
$3: 2.83
$4: 4.00
$5: dBm

我的代码:

my $txt='RMS Power                     :  [   0.00]>[   2.83]<[   4.00]dBm        [PASS]';

$re='.*?(\[([^\]]+)\]).*?(\[([^\]]+)\]).*?(\[([^\]]+)\])';
if ($txt =~ m/$re/is)
{
    $sbraces1=$1;
    $sbraces2=$2;
    $sbraces3=$3;
    $sbraces4=$4;
    $sbraces5=$5;
    print "$sbraces1 $sbraces2 $sbraces3 $sbraces4 $sbraces5 \n";
}

以上是我的代码,输出是&#34; [0.00] 0.00 [2.83] 2.83 [4.00]&#34;,我还想获得“RMS Power”,“dBm”字符串。

如果你能给我一些建议,我将不胜感激。

4 个答案:

答案 0 :(得分:0)

以下正则表达式适用于您的示例,但我不确定我是否完全理解您。您可能需要更精确一点。

^.*?(?=\s*:)|(?<=\[\s{3}).*?(?=\s*\])|(?<=\])\w+

演示here

答案 1 :(得分:0)

试试这段代码。

my $txt='RMS Power                     :  [   0.00]>[   2.83]<[   4.00]dBm        [PASS]';

$re='(.*)\s*:\s*\[\s*(.*)\]>\[\s*(.*)\]<\[\s*(.*)\](.*)\[.*\]';
if ($txt =~ m/$re/is)
{
    $sbraces1=$1;
    $sbraces2=$2;
    $sbraces3=$3;
    $sbraces4=$4;
    $sbraces5=$5;
    print "$sbraces1 $sbraces2 $sbraces3 $sbraces4 $sbraces5 \n";
}

答案 2 :(得分:0)

use Modern::Perl;
use Data::Dumper;

my $re = qr/^(.+?)\s+:\s+\[\s*(\S+?)\]>\[\s*(\S+?)\]<\[\s*(\S+?)\](\S+)/;
my $txt='RMS Power                     :  [   0.00]>[   2.83]<[   4.00]dBm        [PASS]';
my @results = $txt =~  $re;
say Dumper\@results;

<强>输出:

$VAR1 = [
          'RMS Power',
          '0.00',
          '2.83',
          '4.00',
          'dBm'
        ];

正则表达式解释:

^           : start of string
  (.+?)     : group 1, 1 or more any character, not greedy
  \s+       : 1 or more spaces
  :         : semicolon
  \s+       : 1 or more spaces
  \[\s*     : open bracket followed by 0 or more spaces
  (\S+?)    : group 2, 1 or more non space, not greedy
  \]>\[\s*  : close bracket, greater than, open bracket, 0 or more spaces
  (\S+?)    : group 3, 1 or more non space, not greedy
  \]>\[\s*  : close bracket, greater than, open bracket, 0 or more spaces
  (\S+?)    : group 4, 1 or more non space, not greedy
  \]        : close bracket
  (\S+)     : group 5, 1 or more non space

答案 3 :(得分:0)

由于有多种方法可以做到,我发布了自己的方法。通过这种方式,您可以轻松实现所需的功能,而不会使模式变得复杂。

这里是模式:

[^ [\]:><]+

就是这样。 它匹配除了字符类中的所有内容之外的所有内容。因此它匹配:

perl -lne 'print $& while/[^[:><\] ]+/g ' file
RMS
Power
0.00
2.83
4.00
dBm
PASS

如果没有g标记,则只输出:RMS
这是关键,你可以重复这种模式,因为你想匹配多个,例如:

([^ [\]:><]+)\s*([^ [\]:><]+)

匹配:RMSPower

你唯一应该想到的是&#34;匹配&#34;在模式之间,他们是

(pattern \s* pattern) \D* (pattern) \D* (pattern) \D* (pattern) \W* (pattern)

可以在 22 步骤

中完成

Demo