2013-07-15 5 views
-3

Как я могу сопоставить следующие строки с использованием perl regexp?Perl regex word matching

$line="virtual void function"; 
$line="virtual function"; 
$line="void function"; 
$line="function"; 
$line="pure virtual function"; 
$line="extern function"; 
$line="extern void function"; 

i.e соответствует 0 или n числу квалификаторов функций, разделенных по крайней мере одним пространством, за которым следует строка «function».

Он не должен соответствовать

$line="// function"; 
$line="asdfgh";  
$line="endfunction";  

Есть ли что-то похожее на

$line=~/^([evp\s]*) function/ ; 

, которые могут быть использованы для слов вместо символов?

+2

может быть: '/^(\ W +) {0,2} функция $/'или'/^ ((virtual | void | pure | extern)) {0,2} function $/' – kjprice

ответ

2

(?:PAT1|PAT2) относится к рисункам как [ab] относится к символам.

/^(?:(?:extern|pure|virtual|void)\s+)*function/ 
+0

Можно ли упростить'/^ (?: extern | pure | virtual | void | \ s *) * function/'? – Jean

+0

Нет, это не эквивалентно. – ikegami

+0

Как насчет '/^(?: extern | pure | virtual | void | \ s + |) + function /'? – Jean

1

Я придумал решение, которое выглядит очень похоже на Икегами:

#!/usr/bin/env perl 
use strict; 
use warnings; 

my @lines = (
    "virtual void function", 
    "virtual function", 
    "void function", 
    "function", 
    "pure virtual function", 
    "extern function", 
    "extern void function", 
    "// function", 
    "asdfgh", 
    "endfunction", 
); 

foreach my $line (@lines) { 
    if ($line =~ m{^((virtual|void|pure|extern)\s+)*function}) { 
     print "$line is a " . ($1||"'plain function'") . "\n"; 
    } 
    else { 
     print "ignored: $line\n"; 
    } 
} 

Который производит:

$ perl 17662838-perl-regex-word-matching.pl 
virtual void function is a void 
virtual function is a virtual 
void function is a void 
function is a 'plain function' 
pure virtual function is a virtual 
extern function is a extern 
extern void function is a void 
ignored: // function 
ignored: asdfgh 
ignored: endfunction