我是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”字符串。
如果你能给我一些建议,我将不胜感激。
答案 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*([^ [\]:><]+)
匹配:RMS
和Power
你唯一应该想到的是&#34;匹配&#34;在模式之间,他们是
(pattern \s* pattern) \D* (pattern) \D* (pattern) \D* (pattern) \W* (pattern)
可以在 22 步骤
中完成