Perl Regex - печатает соответствующее значение - PullRequest
22 голосов
/ 11 апреля 2011

Что такое регулярное выражение perl для печати соответствующего значения? Например, я хочу напечатать 195 из этой строки

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

Как я могу это сделать? Заранее спасибо

Ответы [ 8 ]

34 голосов
/ 11 апреля 2011

Вы можете использовать круглые скобки в регулярных выражениях для захвата подстрок. Захваченные группы хранятся в $ 1, $ 2 и т. Д. Пример:

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

или несколько короче:

while (<>) {
    print "$1\n" if /Total Successful Transactions = (\d+)/;
}
13 голосов
/ 30 октября 2012

Просто хотел перефразировать предыдущие ответы немного по-другому; обратите внимание, что в этом случае:

$ 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 г .: через Назначить одно или несколько совпадений регулярных выражений переменной в виде однострочного Perl (массив разыменования?) - это также можно сделать для одного линейного элемента:

$ 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

Ну, надеюсь, это кому-нибудь поможет,
Ура!

9 голосов
/ 11 апреля 2011

Как насчет просто:

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

Вам редко нужно использовать $1 и друзей.

5 голосов
/ 30 июня 2011
/(\d+$)/;
print $1;

Полагаю, вам просто нужно число 195.Правильно?

2 голосов
/ 19 апреля 2017

Версия принятого ответа командной строки @ markusk довольно компактна:

perl -ne '/Total Successful Transactions = (\d+)/ && print "$1\n";'
2 голосов
/ 11 апреля 2011

Проверьте последние цифры перед " и ..

#!/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;
2 голосов
/ 11 апреля 2011
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

0 голосов
/ 11 апреля 2011

Примерно так:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...