4

Perl の行から部分文字列を抽出したいと考えています。例を挙げて説明しましょう:

fhjgfghjk3456mm   735373653736
icasd 666666666666
111111111111

上記の行では、12 桁の数字のみを抽出したいと考えています。関数を使用してみましたsplit

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

しかし、それは、文字列の一致した部分を削除し、残余を に格納するだけ@ccです。柄に合わせた部分をプリントしたい。どうすればいいですか?

4

4 に答える 4

8

正規表現でそれを行うことができます:

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

ここで正規表現をテストします: 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
----------------------------------------------------------------------
于 2012-07-02T12:59:04.840 に答える
3
#!/bin/perl
my $var = 'fhjgfghjk3456mm 735373653736 icasd 666666666666 111111111111';
if($var =~ m/(\d{12})/) {
  print "Twelve digits: $1.";
}
于 2012-07-02T12:58:13.260 に答える
3

$1 組み込み変数は、正規表現からの最後の一致を格納します。また、文字列全体に対して正規表現を実行すると、文字列全体が返されます。ここでの最善の解決策は、一致を括弧で囲み、$1 を出力することです。

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

これにより、正規表現が 12 桁の数字と一致し、その一致を $1 で返します。

于 2012-07-02T13:04:01.013 に答える
1
#!/usr/bin/env perl

undef $/;
$text = <DATA>;
@res = $text =~ /\b\d{12}\b/g;
print "@res\n";

__DATA__
fhjgfghjk3456mm   735373653736
icasd 666666666666
111111111111
于 2012-07-02T14:18:40.757 に答える