2012-07-02 3 views
3

Я хочу извлечь подстроку из строки в Perl. Позвольте мне объяснить, например:Извлечь требуемую подстроку из другой строки -Perl

fhjgfghjk3456mm 735373653736 
icasd 666666666666 
111111111111 

В приведенных выше строках я хочу только извлечь 12-значное число. Я попытался с помощью split функции:

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

Но что она делает это удаляет совпадающую часть строки и сохраняет остаток в @cc. Я хочу, чтобы часть, соответствующая шаблону, была напечатана. Как мне это?

ответ

3

в $ 1 встроенной переменной сохраняет последний матч с регулярным выражением. Кроме того, если вы выполняете регулярное выражение для целой строки, оно возвращает всю строку. Лучшее решение здесь - поставить круглые скобки вокруг вашего матча, а затем напечатать $ 1.

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

Это делает наше регулярное выражение JUST двенадцатизначным числом, а затем мы возвращаем это соответствие с $ 1.

+0

спасибо .. Это было довольно просто .. Но поверьте мне, я много читал, прежде чем отправлять на этот вопрос. Большое спасибо .. – Amey

+7

Вы не должны использовать '$ 1' без условного. – TLP

3
#!/bin/perl 
my $var = 'fhjgfghjk3456mm 735373653736 icasd 666666666666 111111111111'; 
if($var =~ m/(\d{12})/) { 
    print "Twelve digits: $1."; 
} 
+0

Благодаря Rawkode ... Это решило мою проблему .. – Amey

7

Вы можете сделать это с regular expressions:

#!/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 
---------------------------------------------------------------------- 
1
#!/usr/bin/env perl 

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

__DATA__ 
fhjgfghjk3456mm 735373653736 
icasd 666666666666 
111111111111 
Смежные вопросы