Suche…


Passende Zeichenfolgen

Der Operator =~ versucht, einen regulären Ausdruck (durch / ) einer Zeichenfolge zuzuordnen:

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

/^hello/ ist der eigentliche reguläre Ausdruck. Das ^ ist ein Sonderzeichen, das den regulären Ausdruck anweist, am Anfang des Strings zu beginnen und nicht irgendwo in der Mitte zu passen. Dann sucht der Regex die folgenden Buchstaben in der Reihenfolge h , e , l , l und o .

Reguläre Ausdrücke versuchen, mit der Standardvariablen ( $_ ) $_ wenn sie leer sind:

$_ = "hello world";

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

Sie können auch verschiedene Trennzeichen verwenden, wenn Sie dem Operator m den regulären Ausdruck voranstellen:

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

Dies ist nützlich, wenn Sie Zeichenfolgen abgleichen, die das Zeichen / :

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

Verwendung von \ Q und \ E bei der Mustererkennung

Was zwischen \ Q und \ E ist, wird als normales Zeichen behandelt

#!/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";
}

}

Ausgabe

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

Eine Zeichenfolge mit einem regulären Ausdruck analysieren

Im Allgemeinen ist es keine gute Idee, einen regulären Ausdruck zu verwenden, um eine komplexe Struktur zu analysieren . Aber es kann gemacht werden. Sie möchten beispielsweise Daten in die Strukturtabelle laden und Felder werden durch Kommas getrennt, komplexe Typen wie Array werden jedoch durch ein "|" getrennt. Dateien enthalten Datensätze, bei denen alle Felder durch Komma getrennt sind und komplexe Typen in eckigen Klammern stehen. In diesem Fall reicht dieses Bit des verfügbaren Perl aus:

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'

Sie möchten die Ausgabe vor Ort überprüfen:

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

Ersetzen Sie eine Zeichenfolge mit regulären Ausdrücken

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow