Klit: Regulärer Ausruck gesucht

Guten Tag,

ich komme nicht weiter mit einem regulären Ausdruck.

Ich habe eine Datei:

  
PID  PUK	TASK	NAME	SEQ%  
000  POLN  17	Katze	-  
001  POLN   1  Dummer Name mit Leerzeichen LN  
002  PO MN 55	TEST 12  

Nun möchte ich folgendes Wissen:
$1 = PID
$2 = PUK
$3 = TASK
$4 = NAME
$5 = SEQ%

Leider sind sowohl im "Name" als auch im "PUK" Leerzeichen möglich, welche auch als Trenner fungieren.

Ich dachte ich hab die Lösung gefunden indem ich mit "?" arbeite um es nicht gierig zu machen. Dennoch klappt das nicht.
$line =~ /^(\w+)\s+([\s\w]*?\w+)\s+(\w+)\s+([\s\w]*?\w+)\s+([\%\w]+)$/;

Und es kommt sowas raus wie:
$1 = 001
$2 = POLN
$3 = 1
$4 = Dummer
$5 = Name

Danke für Hilfe.

Grüsse
Klit

  1. Hi,

    PID  PUK TASK NAME SEQ%
    000  POLN  17 Katze -
    001  POLN   1  Dummer Name mit Leerzeichen LN
    002  PO MN 55 TEST 12

      
    
    > Leider sind sowohl im "Name" als auch im "PUK" Leerzeichen möglich, welche auch als Trenner fungieren.  
      
    Sinnvollste Vorgehensweise: ändere das Trennzeichen in eines, das nicht in den Daten selbst vorkommt. z.B. Tab. Oder ~.  
      
    
    > Ich dachte ich hab die Lösung gefunden indem ich mit "?" arbeite um es nicht gierig zu machen.  
      
    Beschreibe doch erstmal ganz ohne Regex, woran SICHER zu erkennen ist, wo eine Spalte aufhört und die nächste anfängt.  
    Und wenn Du diese Beschreibung hast und diese nicht in den Regex einbauen kannst, dann frag nochmal nach.  
      
      
    cu,  
    Andreas
    
    -- 
    [Warum nennt sich Andreas hier MudGuard?](http://MudGuard.de/)  
    [O o ostern ...](http://ostereier.andreas-waechter.de/)  
      
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.  
    
    
    1. Hi,

      PID  PUK TASK NAME SEQ%
      000  POLN  17 Katze -
      001  POLN   1  Dummer Name mit Leerzeichen LN
      002  PO MN 55 TEST 12

      
      >   
      > > Leider sind sowohl im "Name" als auch im "PUK" Leerzeichen möglich, welche auch als Trenner fungieren.  
      >   
      > Sinnvollste Vorgehensweise: ändere das Trennzeichen in eines, das nicht in den Daten selbst vorkommt. z.B. Tab. Oder ~.  
        
      Geht nicht, da die Ausgabe von einer Applikation kommt, die ich nicht ändern kann.  
        
      
      > > Ich dachte ich hab die Lösung gefunden indem ich mit "?" arbeite um es nicht gierig zu machen.  
      >   
      > Beschreibe doch erstmal ganz ohne Regex, woran SICHER zu erkennen ist, wo eine Spalte aufhört und die nächste anfängt.  
      > Und wenn Du diese Beschreibung hast und diese nicht in den Regex einbauen kannst, dann frag nochmal nach.  
        
      Ich würde sagen:  
      Zeilenanfang,1-n Zahlen,1-n Leerzeichen als Trenner, 1-n Zeichen mit 0-n Leerzeichen, 1-n Leerzeichen als Trenner,1-n Zahlen, 1-n Zeichen mit 0-n Leerzeichen,1-n Leerzeichen als Trenner, 1-n Zeichen,Zeilenende  
        
      Ich komme aber wirklich nicht auf den RegExp dafür. Hilfe wäre toll.
      
      1. Ich würde sagen:
        Zeilenanfang,1-n Zahlen,1-n Leerzeichen als Trenner, 1-n Zeichen mit 0-n Leerzeichen, 1-n Leerzeichen als Trenner,1-n Zahlen, 1-n Zeichen mit 0-n Leerzeichen,1-n Leerzeichen als Trenner, 1-n Zeichen,Zeilenende

        ^(\d+)( +)(.+)( +)(\d+)(.+)( +)(.+)$

        Falls du mit den "1-n Zeichen" am Ende alles außer Leerzeichen meinst, dann:

        ^(\d+)( +)(.+)( +)(\d+)(.+)( +)([^ ]+)$

        Ich komme aber wirklich nicht auf den RegExp dafür. Hilfe wäre toll.

        Krieg ich'n Keks?

        1. Ich würde sagen:
          Zeilenanfang,1-n Zahlen,1-n Leerzeichen als Trenner, 1-n Zeichen mit 0-n Leerzeichen, 1-n Leerzeichen als Trenner,1-n Zahlen, 1-n Zeichen mit 0-n Leerzeichen,1-n Leerzeichen als Trenner, 1-n Zeichen,Zeilenende

          ^(\d+)( +)(.+)( +)(\d+)(.+)( +)(.+)$

          Falls du mit den "1-n Zeichen" am Ende alles außer Leerzeichen meinst, dann:

          ^(\d+)( +)(.+)( +)(\d+)(.+)( +)([^ ]+)$

          Ich komme aber wirklich nicht auf den RegExp dafür. Hilfe wäre toll.

          Krieg ich'n Keks?

          Einen halben bislang :)
          Sobald ich es minimal  erweitere, da meine Überschrift zeichen und nicht nur Zahlen erhält klappte es wieder nicht
          $line = "001  PO LN   1  Dummer Name mit Leerzeichen LN";

          ^(\d+)( +)(.+)( +)(\w+)(.+)( +)([^ ]+)$  
            
          print "$1;$2;$3;$4;$5;$6;$7;$8;$9;\n";  
          001;  ;PO LN   1  Dummer Name; ;mit; ;Leerzeichen; ;LN;  
          
          

          Ich habe eine dunkle Ahnung, dass sich sowas bentöige wie hier beschrieben : http://docstore.mik.ua/orelly/perl/cookbook/ch06_16.htm

          Oder nicht?

      2. Klit: ...

        klit: ...

        Der Rückgang an Erregung läßt eine Steigerung der Aufmerksamkeit erhoffen.

  2. Leider sind sowohl im "Name" als auch im "PUK" Leerzeichen möglich, welche auch als Trenner fungieren.

    Ist nicht das schon das aus für dein Vorhaben?

    1. Hallo,

      Leider sind sowohl im "Name" als auch im "PUK" Leerzeichen möglich, welche auch als Trenner fungieren.
      Ist nicht das schon das aus für dein Vorhaben?

      Nicht wenn in TASK nur Ziffern enthalten sind und in NAME und PUK keine sein können.

      Gruß
      Kalk