Sök…


Matchande strängar

Operatören =~ försöker matcha ett reguljärt uttryck (separerat av / ) till en sträng:

my $str = "hello world";
print "Hi, yourself!\n" if $str =~ /^hello/;

/^hello/ är det verkliga reguljära uttrycket. ^ Är ett specialtecken som berättar det reguljära uttrycket att börja med början av strängen och inte matcha i mitten någonstans. Därefter försöker regexet hitta följande bokstäver i ordning h , e , l , l och o .

Vanliga uttryck försöker matcha standardvariabeln ( $_ ) om det är känt:

$_ = "hello world";

print "Ahoy!\n" if /^hello/;

Du kan också använda olika avgränsare om du föregår det vanliga uttrycket med operatören m :

m~^hello~;
m{^hello}; 
m|^hello|;

Detta är användbart när du matchar strängar som inkluderar / -tecknet:

print "user directory" if m|^/usr|;

Användning av \ Q och \ E i mönstermatchning

Vad som är mellan \ Q och \ E behandlas som vanliga tecken

#!/usr/bin/perl

my $str = "hello.it's.me";

my @test = (
  "hello.it's.me",
    "hello/it's!me",
    );

sub ismatched($) { $_[0] ? "MATCHED!" : "DID NOT MATCH!" }

my @match = (
      [ general_match=> sub { ismatched /$str/ } ],
      [ qe_match    => sub { ismatched /\Q$str\E/ } ],
      );

for (@test) {
    print "\String = '$_':\n";

foreach my $method (@match) {
    my($name,$match) = @$method;
    print "  - $name: ", $match->(), "\n";
}

}

Produktion

String = 'hello.it's.me':
  - general_match: MATCHED!
  - qe_match: MATCHED!
String = 'hello/it's!me':
  - general_match: MATCHED!
  - qe_match: DID NOT MATCH!

Analysera en sträng med en regex

I allmänhet är det inte bra att använda ett vanligt uttryck för att analysera en komplex struktur . Men det kan göras. Till exempel kanske du vill läsa in data i bikuptabellen och fält separeras med komma men komplexa typer som array separeras med en "|". Filer innehåller poster med alla fält separerade med komma och komplex typ är i fyrkantig konsol. I så fall kan denna bit av engångs Perl vara tillräcklig:

echo "1,2,[3,4,5],5,6,[7,8],[1,2,34],5" | \
    perl -ne \
        'while( /\[[^,\]]+\,.*\]/ ){
            if( /\[([^\]\|]+)\]/){
                $text = $1;
                $text_to_replace = $text;
                $text =~ s/\,/\|/g;
                s/$text_to_replace/$text/;
            }
        } print'

Du vill kolla in produktionen:

1,2, [3 | 4 | 5], 5,6, [7 | 8], [1 | 2 | 34], 5

Byt ut en sträng med reguljära uttryck

s/foo/bar/;         # replace "foo" with "bar" in $_
my $foo = "foo";
$foo =~ s/foo/bar/; # do the above on a different variable using the binding operator =~
s~ foo ~ bar ~;     # using ~ as a delimiter
$foo = s/foo/bar/r; # non-destructive r flag: returns the replacement string without modifying the variable it's bound to
s/foo/bar/g;        # replace all instances


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow