Extracto de la necesaria subcadena de otra cadena -Perl

Quiero extraer una subcadena de una línea en Perl. Me explico dar un ejemplo:

fhjgfghjk3456mm   735373653736
icasd 666666666666
111111111111

En las líneas de arriba, solo quiero extraer los 12 dígitos del número. He intentado utilizar split función:

my @cc = split(/[0-9]{12}/,$line);
print @cc;

Pero, lo que sí se quita la coincidencia de parte de la cadena y almacena el residuo en @cc. Quiero la parte coincide con el patrón para ser impreso. ¿Cómo hago eso?

InformationsquelleAutor Amey | 2012-07-02

4 Kommentare

  1. 3

    El $1, construido-en la variable almacena el último partido de una expresión regular. También, si se realiza una expresion regular en toda la cadena, se devolverá la totalidad de la cadena. La mejor solución es poner entre paréntesis alrededor de su partido, print $1.

    my $strn = "fhjgfghjk3456mm 735373653736\nicasd\n666666666666 111111111111";
    $strn =~ m/([0-9]{12})/;
    print $1;

    Esto hace que nuestra expresión regular coincide SÓLO a los doce dígitos y, a continuación, volvemos a juego con $1.

    • Gracias.. Que era bastante simple.. Pero confía en mí, he leído mucho antes de la publicación de esta pregunta. Muchas gracias..
    • Usted no debe usar $1 sin un condicional.
  2. 8

    Usted puede hacerlo con expresiones regulares:

    #!/usr/bin/perl
    my $string = 'fhjgfghjk3456mm 735373653736 icasd 666666666666 111111111111';
    while ($string =~ m/\b(\d{12})\b/g) {
      say $1;
    }

    Prueba de la regex aquí: http://rubular.com/r/Puupx0zR9w

    use YAPE::Regex::Explain;
    print YAPE::Regex::Explain->new(qr/\b(\d+)\b/)->explain();
    
    The regular expression:
    
    (?-imsx:\b(\d+)\b)
    
    matches as follows:
    
    NODE                     EXPLANATION
    ----------------------------------------------------------------------
    (?-imsx:                 group, but do not capture (case-sensitive)
                             (with ^ and $ matching normally) (with . not
                             matching \n) (matching whitespace and #
                             normally):
    ----------------------------------------------------------------------
      \b                       the boundary between a word char (\w) and
                               something that is not a word char
    ----------------------------------------------------------------------
      (                        group and capture to \1:
    ----------------------------------------------------------------------
        \d+                      digits (0-9) (1 or more times (matching
                                 the most amount possible))
    ----------------------------------------------------------------------
      )                        end of \1
    ----------------------------------------------------------------------
      \b                       the boundary between a word char (\w) and
                               something that is not a word char
    ----------------------------------------------------------------------
    )                        end of grouping
    ----------------------------------------------------------------------
  3. 3
    #!/bin/perl
    my $var = 'fhjgfghjk3456mm 735373653736 icasd 666666666666 111111111111';
    if($var =~ m/(\d{12})/) {
      print "Twelve digits: $1.";
    }
  4. 1
    #!/usr/bin/env perl
    
    undef $/;
    $text = <DATA>;
    @res = $text =~ /\b\d{12}\b/g;
    print "@res\n";
    
    __DATA__
    fhjgfghjk3456mm   735373653736
    icasd 666666666666
    111111111111

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea