Zum neuen Informatik-Forum >>
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

[RegEx] Dateigerecht geschriebene Namen parsen

 
Dieses Forum ist gesperrt, du kannst keine Beiträge editieren, schreiben oder beantworten.   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    Informatikerboard.de Foren-Übersicht -> Sonstige Programmiersprachen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Crock



Anmeldungsdatum: 12.07.2005
Beiträge: 2
Wohnort: Hamburg

BeitragVerfasst am: 09. Aug 2005 23:05    Titel: [RegEx] Dateigerecht geschriebene Namen parsen Antworten mit Zitat

Hossa,

ich selbst bin recht belesen aber unglaublich unerfahren in RegEx ;-)

Nun brauche ich eure Hilfe.
Ich hab ein Verzeichnis mit Wallpapern (schoener Frauen Prost )
Alle Dateinamen sind im folgenden Format:
vorname_nachname<2-stellige nummer>.jpg
es ist immer alles klein geschrieben.
Nun kann sowohl der Vorname als auch der Nachname ein Doppelname sein a la:
"Cosma Shiva Hagen" oder "Mary-Kate Olsen",
Jedes Leerzeichen in einem Namen wird durch ein _ ersetzt.

Ich moechte folgendes mit einem RegEx erreichen:

  • Abtrennen der 2-stelligen Nummer und des ".jpg".
  • Jedes _ durch ein " " ersetzen.
  • Jeden Buchstaben der am Anfang des Dateinamens, hinter einem Leerzeichen oder hinter einem Bindestrich steht ins Grosse zumzuwandeln.

Ich habe fuer alles einn Ansatz, krieg sie aber nicht ganz zusammen.
Ich benutze Perl (das ist schon ein wichtiger Fakt, denn sonst waere das mit der Gross-Klein-Umwandlung nicht moeglich, danke an \u).

Mein bisheriger Ansaetze:
In $newname liegt zur Zeit etwas a la "mary-kate_olsen01.jpg".


Code:

# Ansatz 1.)


$newname =~ s{
  (                              #Neuen Namen in \1 speichern
    \u[^-0-9][^-0-9]+            # Erstes Zeichen Gross schreiben und den Rest auflesen bis...
    (?:[-_]                      # ...zu einem Unter- oder Binderstrich.
      \u[^-0-9][^-0-9]+          # und wieder Weitermachen.
    )*                           # die letzte Klammerung wiederholen bis...
  )                              # (Speicherung ende)
  [0-9]{2}                       #... die 2-stellige Nummer kommt.
  \,jpg
}
{\1}ix;

Problem: Der Unterstrich wird nicht entfernt bzw. durch ein Leerzeichen ersetzt.

Code:

#Ansatz 2.)


$newname ~= s{
  (                                # Speichern in \1
    \u[^-0-9][^-0-9]+              #Auflesen bis...
    (-\u[^-0-9][^-0-9]+)*          # bis zum naechsten (optionalen) Bindestrich und normal weitermachen. Das so oft wiederholen bis...
  )                                # (Speicherung ende)
   _
}
{\1 }gix;                          #man beachte das Leerzeichen hinter \1


Problem: 2-stellige Ziffer und .jpg-Endung bleibt erhalten.

Habt ihr eine Idee das zusammenzufassen?
Wenns nicht geht (was mir fast so scheint), dann ist es so.

PS: Es interessiert mich hieder weder Performance noch Schoenheit, mich interessiert nur, ob das Problem mit einem RegEx loesbar ist.

_________________
MfG Alexander Surma
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
kurellajunior
Administrator


Anmeldungsdatum: 14.02.2005
Beiträge: 214
Wohnort: Berlin-Pankow

BeitragVerfasst am: 10. Aug 2005 00:20    Titel: Antworten mit Zitat

Zum ersten RegEx für regular expression kann nur einen String identifizieren, ihn aber nicht Verändern (Im Prinzip)

Daher kann ein solcher RegEx nur mit Ersetzungsfunktionen verwendet werden. (In php glaub ich regreplace oder so) Im Ersetzungsmuster kannst Du dann meist mit \1 oder $1 auf Gruppierungen zugreifen. ALlerdings sind dann Konstrukte der Art ()* tabu, da der zweite Fund den ersten überschreibt Du brauchst also etwas der Art

(name)-?(name)?_(name)-?(name)?\.jpg

und dann im Ersetzungsfall: $1 $2 $3 $4

Dies ist nicht perfek, da hier doppelte Leerzeichen entstehen können. Um die noch auszuschließen brauchst Du bedingte RegEx, aber ab hier wirds für einen Anfänger Haarwurschtelig und ich müsste selber nachsehen Augenzwinkern

Hilft das erstmal?

Tip Ich empfehle in diesem Fall ein zwei verschatelte RegEx-Ersetzungen, macht die Sache übersichtlicher.

Jan

_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Gast






BeitragVerfasst am: 10. Aug 2005 00:37    Titel: Antworten mit Zitat

kurellajunior hat Folgendes geschrieben:
Zum ersten RegEx für regular expression kann nur einen String identifizieren, ihn aber nicht Verändern (Im Prinzip)

Ja das stimmt schon, aber ich wollte jetzt nicht hier Haare spalten, dannwaere der Post noch alenger geworden ;-)

kurellajunior hat Folgendes geschrieben:

ALlerdings sind dann Konstrukte der Art ()* tabu, da der zweite Fund den ersten überschreibt.


Das stimmt auch, tut aber eigentlich ncihts zur Sache. Denn wie du an meinem Beispielen siehst, funktioniert das an sich ganz gut. Z.B. mit dem Global-Modus o.ae.
kurellajunior hat Folgendes geschrieben:

Du brauchst also etwas der Art
(name)-?(name)?_(name)-?(name)?\.jpg

und dann im Ersetzungsfall: $1 $2 $3 $4

Dies ist nicht perfekt.

Hm ja, das ist mir zu absolut. Es gibt wahrscheinlich keine Loesung fuer dieses Problem, aber ich wollt wenigstens mal gefragt haben.
Ich ahtte die Variante, die bei diesem Thread rausgekommen waer, sowieso nicht genutzt, das sie wahrscheinlich das Performance-allterletzte gewesen waer.
Ic hwerde bei meinem Zweiten Ansatz bleiben, und dann weinfach im Zweiten durchgang das Ende abcutten.

Dankeschoen smile
Nach oben
Beiträge der letzten Zeit anzeigen:   
Dieses Forum ist gesperrt, du kannst keine Beiträge editieren, schreiben oder beantworten.   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    Informatikerboard.de Foren-Übersicht -> Sonstige Programmiersprachen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum nicht herunterladen