Perl Regex - 打印匹配的值

时间:2011-04-11 05:58:59

标签: regex perl

打印匹配值的perl正则表达式是什么?例如,我想从此字符串中打印195

"2011-04-11 00:39:28,736::[main]::INFO (Main.java:73) Test.Main::main() Total Successful Transactions = 195".

我该怎么做?提前致谢

8 个答案:

答案 0 :(得分:34)

您可以在正则表达式中使用括号来捕获子字符串。捕获的组存储在$ 1,$ 2等中。例如:

while (<>) {
    if (/Total Successful Transactions = (\d+)/) {
        print "$1\n";
    }
}

或者更短:

while (<>) {
    print "$1\n" if /Total Successful Transactions = (\d+)/;
}

答案 1 :(得分:13)

只想稍微改变以前的答案;请注意,在这种情况下:

$ perl -e '$str="the variable Xy = 3 in this case"; print $str =~ /Xy = 3/;'
1 

...我们打印出1 - 就像“是的,我得到了一个匹配”。如果我们想要返回匹配的文本部分,如@markusk指出的那样,“在正则表达式中使用括号来捕获子字符串”:

$ perl -e '$str="the variable Xy = 3 in this case"; print $str =~ /(Xy = 3)/;'
Xy = 3

但是,请注意,在捕获时,您可能会遇到使用此习惯用法连接字符串的问题:

$ perl -e '$str="the variable Xy = 3 in this case"; print $str =~ /Xy = 3/ . "\n";' 
1 # OK
$ perl -e '$str="the variable Xy = 3 in this case"; print $str =~ /(Xy = 3)/ . "\n";' 
1 # NOT OK

...在这种情况下,最好将事情分开:

$ perl -e '$str="the variable Xy = 3 in this case"; print $str =~ /(Xy = 3)/ ; print "\n";'
Xy = 3 # OK again

然而,如果我们想要捕捉“某些东西”,比如一个数字 - 那么,因为我们使用括号,我们会自动返回与这个习语的匹配(而不是整个“搜索”字符串):

$ perl -e '$str="the variable Xy = 3 in this case"; print $str =~ /Xy = (\d)/ ; \
print "\n";'
3

...因此,要完整地捕获搜索到的字符串,我们应该再将它包装在括号中:

$ perl -e '$str="the variable Xy = 3 in this case"; print $str =~ /(Xy = (\d))/ ; \
print "\n";'
Xy = 33

....但是,我们没有得到我们的期望,因为现在有两个匹配,$1$2;显然,成语“print $str =~ /.../”会输出所有匹配项(在本例中为“$1$2”)。

因此,为了获得此嵌套匹配案例中的搜索字符串,我们现在 只显式指定$1

$ perl -e '$str="the variable Xy = 3 in this case"; $str =~ /(Xy = (\d))/ ; \
print "$1 \n";'
Xy = 3 

2013年10月编辑:通过Assign one of multiple regex matches to variable as Perl one-liner (dereference array?) - 这也可以用于一个班轮:

$ perl -e '$str="the variable Xy = 3 in this case"; \
print ( ( $str =~ /(Xy = (\d))/ )[1] ); print "\n";'
3

...但是,请注意第print个括号的第二个包络集需要直接使用正则表达式(匿名?)数组。

最后,在多行上下文中,确保首先将整个文件/文本“啜饮”成一个字符串;然后使用/s(单行模式=匹配换行符)和/g(全局/多个匹配) - 最后,确保匹配表达式位于while循环中,以便迭代所有比赛:

$ echo "some data
IN
123
OUT
some more data
 is about to follow:
IN
256
OUT
done with data
out" | perl -e '$str = do { local $/; <> }; while ($str =~ /(IN(.*?)OUT)/sg) { print "$1\n"} '

IN
123
OUT
IN
256
OUT

嗯,希望这有助于某人,
干杯!

答案 2 :(得分:9)

如何:

print $string =~ /Total Successful Transactions = (\d+)/;

您实际上很少需要使用$1和朋友。

答案 3 :(得分:5)

/(\d+$)/;
print $1;

我猜你只想要数字195。正确?

答案 4 :(得分:2)

my $str = '"2011-04-11 00:39:28,736::[main]::INFO (Main.java:73) Test.Main::main() Total Successful Transactions = 195".';

$str =~ /Total Successful Transactions = (\d+)/;
print $1; 

195将存储在$ 1

答案 5 :(得分:2)

检查".之前的最后一位数字。

#!/usr/bin/env perl

use strict;
use warnings;

my $string = q{"2011-04-11 00:39:28,736::[main]::INFO (Main.java:73) Test.Main::main() Total Successful Transactions = 195".};
my ($number) = $string =~ m{ (\d+) " \. \z}x;

print "Matched number: $number\n" if defined $number;

答案 6 :(得分:2)

@markusk接受的答案的命令行版本非常紧凑:

perl -ne '/Total Successful Transactions = (\d+)/ && print "$1\n";'

答案 7 :(得分:0)

像这样:

if ("2011-04-11 00:39:28,736::[main]::INFO (Main.java:73) Test.Main::main() Total Successful Transactions = 195" =~ /(\d+)$/) {
    print $1;
}

匹配后,匹配的组将以$ 1 .. $ n。

的形式提供