Flo: Reg. Expression >> Zeichenkette aufteilen

Hallo alle,

ich habe eine Zeichenkette und diese möchte ich aufteilen und in ein Array schreiben. Und zwar so:

push(@array, split(/\s+/,$zeichenkette) );

Nur leider kommt auch mal ein String mit "Wort 1" und dort soll er nicht beim Leerzeichen aufhören, sondern eben "Wort 1" und erst danach.

Wie kann man so eine Ausnahme angeben? Vielen Dank

Flo

  1. Hi,

    Wie kann man so eine Ausnahme angeben? Vielen Dank

    zuerst solltest du exakt und verallgemeinert definieren, was die Regel und was die Ausnahme ist.

    Gruß
    MrWurf

    1. Hallo,

      ja die Regel ist immer ein Wort nehmen und bei Leerzeichen wieder aufhören und das nächste nehmen. Nur kommen jetzt Wörter mit "..." vor und dort soll nicht bei einem Leerzeichen der nächste Wert genommen werden.

      1. Hi,

        ja die Regel ist immer ein Wort nehmen und bei Leerzeichen wieder aufhören und das nächste nehmen. Nur kommen jetzt Wörter mit "..." vor und dort soll nicht bei einem Leerzeichen der nächste Wert genommen werden.

        da ist vermutlich eine Iteration besser als das Splitten:
        So ungefähr: (nicht gestestet)

        while( $zeile=~/\s(\S+)\s|"(.+?)"/g )
        {
         my $neues_wort = $1;
        }

        wird nicht für das erste und letzte Wort funktionieren, aber als Ansatz ausreichend.

        Gruß
        MrWurf

  2. push(@array, split(/\s+/,$zeichenkette) );

    my @array = split /\s+/, $zeichenkette;

    Nur leider kommt auch mal ein String mit "Wort 1" und dort soll er nicht beim Leerzeichen aufhören, sondern eben "Wort 1" und erst danach. Wie kann man so eine Ausnahme angeben?

    Negatives Lookahead sollte helfen:

    my $string = 'Wort 1 Wort 2 Wort 3';  
    my @liste = split /\s+(?!\d)/, $string;  
    print join "\n", @liste;
    

    Das Lookahead-Konstrukt musst du, wie MrWurf schon anmerkte, an deine Gegebenheiten anpassen, die wir nicht kennen.

    Siechfred

    --
    Ich bin strenggenommen auch nur interessierter Laie. (molily)
    1. Leider ist mir jetzt nicht ganz klar wie du das meinst. Ich habe einen Text mit

      Hallo ich bins der "Sieg fried" jetzt möchte ich ein Array mit:

      0: Hallo
      1: ich
      2: bins
      3: der
      4: "Sieg fried"

      Wie kann ich denn sowas machen?

      Vielen Dank

      Flo

      1. Hey,
        das ist ein Fall von ausgeglichenem Text. Dafür braucht man Spezialwerkzeug.

          
          
        #!perl -T  
        use strict;  
        use diagnostics;  
          
        use Data::Dump::Streamer;  
        use Text::Balanced qw(extract_delimited);  
          
        our $seperator = ' ';  
        our $balancedseperator = '"';  
          
        sub parse {  
            # take $string  
            # return $remainder_of_string, [@parts_split_by_seperator]  
          
            $_ = shift;  
            my ($head, $tail);  
          
            if (/^$balancedseperator/) {  
                ($head, $tail) = extract_delimited $_, $balancedseperator;  
                return $tail, [$head];  
            } else {  
                if (/$balancedseperator/) {  
                    ($head, $tail) = /(.*?)($balancedseperator.*)/;  
                    return $tail, [split $seperator, $head];  
                } else {  
                    return '', [split $seperator, $_];  
                };  
            };  
        };  
          
        # --  
          
        while (<DATA>) {  
            chomp;  
          
            my @parts;  
            while (length) {  
                my ($remainder, $partsref) = parse $_;  
                push @parts, grep {length} @{$partsref};  
                $_ = $remainder;  
            };  
            Dump [@parts];  
        };  
          
        __DATA__  
        Hallo ich bins der "Sieg fried"  
        "Sieg fried" halli hallo  
        Hallo "Sieg fried" du da "Sieg fried" la bla gna  
        foo bar baz  
        "Sieg fried"  
        
        

        Die Sub parse beackert den übergebenen String solange, bis von ihm nichts übrig bleibt.

        --
        水-金-地-火-木-土-天-海-冥