2011-04-11 17 views
21

¿Qué es la Perl Regex para imprimir el valor coincidente? Por ejemplo, quiero imprimir 195 de esta cadenaPerl Regex - Imprime el valor coincidente

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

¿Cómo puedo hacer eso? Gracias de antemano

Respuesta

28

Puede usar paréntesis en expresiones regulares para capturar subcadenas. Los grupos capturados se almacenan en $ 1, $ 2, y así sucesivamente. Ejemplo:

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

o, algo más corta:

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

así:

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

Una vez que coinciden, los grupos emparejados a estar disponibles como $ 1 .. $ n.

+0

Gracias, pero es posible decir el valor de impresión (número) en la que está presente en la cadena "tranaction éxito". – Allwyn

+0

hola markusk dado la respuesta. – Allwyn

1
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 se almacenará $ 1

2

Comprobar para los dígitos en la última justo antes " y ..

#!/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; 
+0

+1 para simplemente usar valores devueltos. – daxim

+0

Debería verificar si la coincidencia falló (estableciendo $ number a undef). Además, dices "al final" pero no implementas eso. – ysth

+0

_ [daxim] (http://stackoverflow.com/users/46395/daxim) _: Gracias. _ [ysth] (http://stackoverflow.com/users/17389/ysth) _: Gracias por avisarme. Fue una señorita. He editado mi respuesta. –

7

¿Qué tal:

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

Usted raramente se necesita usar $1 y amigos.

+0

+1 para simplemente usar valores devueltos. – daxim

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

supongo que lo que desea es el número 195. ¿Derecha?

11

Sólo quería replantear las respuestas anteriores un poco diferente; en cuenta que en este caso:

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

... Podemos obtener 1 está imprimiendo a cabo - como en "sí, tengo un partido". Si queremos devolver la parte texto coincidente, como @markusk señaló, "uso de paréntesis en expresiones regulares para capturar subseries":

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

Sin embargo, tenga en cuenta que es posible que tenga un problema de concatenación de cadenas con este idioma, cuando captura:

$ 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 

... así que probablemente mejor mantener las cosas separadas en ese caso:

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

 

Sin embargo, si queremos capturar "algo", dicen un dígito - a continuación, ya que utilizamos paréntesis, volvemos automáticamente justo ese partido con este idioma (no todo el "buscado" string):

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

...por lo tanto, para capturar la cadena buscada en su totalidad, debemos envolverlo de nuevo en paréntesis:

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

.... pero, no obtenemos lo que esperamos, porque ahora hay dos partidos, y $1$2; y aparentemente el modismo "print $str =~ /.../" genera todas las coincidencias (en este caso, "$1$2").

Para conseguir tan sólo la cadena buscada en este caso coincidencias anidada, que ahora tenemos especificar explícitamente única $1:

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

EDITAR oct 2013: Via Assign one of multiple regex matches to variable as Perl one-liner (dereference array?) - También esto se puede hacer por uno liner:

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

... sin embargo, tenga en cuenta la necesidad de un segundo conjunto envolvente de paréntesis para el print para trabajar directamente con devolvió la expresión regular (Anonymo nosotros?) matriz.

 

Por último, en un contexto de múltiples líneas, asegúrese de primera "slurp" todo el archivo/texto en una sola cadena; a continuación, utilizar el /s (modo de una sola línea = salto de línea se corresponde) y /g (partidos globales/múltiple) - y, por último, asegúrese de que la expresión de coincidencia es en un bucle while, con el fin de recorrer todos los partidos:

$ 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 

Bueno, espero que esto ayude a alguien,
¡Salud!

+0

Slurping todo el archivo puede ser costoso para grandes entradas. Una alternativa es usar el operador de rango: 'perl -ne 'print if/IN /../ OUT /' ' – markusk

1

La versión de línea de comandos de la respuesta aceptada por @markusk es bastante compacto:

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