Masipulami: Problem mit Regular Expression

Hallo zusammen,

ich habe ein Problem mit ein (paar) Regular Expressions und hoffe ihr könnt mir weiterhelfen.

Ich habe als Ausgangsbasis folgenden String:
for200711281234567890123456789.xml

Nun muss ich aus diesem String ein mal das Datum extrahieren (...20071128...) und dann noch mal die 19-stellige Zahl danach.
Momentan hab ich das so gelöst:

my $string = "for200711281234567890123456789.xml";

my $week_curr = $string
my $ts_curr = $string;

get week data from $FileApplic

$week_curr =~ s/.xml$//;
$week_curr =~ s/([1]{3})//;
$week_curr =~ /([2]{8})/;

get timestamp from $FileApplic

$ts_curr =~ s/.xml$//;
$ts_curr =~ s/([3]{3})//;
$ts_curr =~ s/([4]{8})//;

So funktioniert es auch, aber ist es nicht möglich jeweils die 3 Zeilen für die RegEx in eine RegEx zusammen zu fassen?
Sitz da jetzt schon den halben Tag dran und bekomms einfach nicht hin die RegEx zu verschönern.

Hoffe mir da kann da jmd. weiterhelfen!

Viele Grüße,
Masipulami


  1. a-z ↩︎

  2. 0-9 ↩︎

  3. a-z ↩︎

  4. 0-9 ↩︎

  1. Hab sogar noch was hässlicheres zusammen gebastelt:

    my $week = "18/10/2007";

    my $year_for_filename = $week;
    my $month_for_filename = $week;
    my $day_for_filename = $week;

    $year_for_filename =~ /([0-9]{4}$)/;
    $month_for_filename =~ /([/][0-9]{2}[/])/;
    $month_for_filename =~ s/([1])//;
    $month_for_filename =~ s/([/]$)//;
    $day_for_filename =~ /([2]{2})/;
    my $week_for_filename = $year_for_filename . $month_for_filename . $day_for_filename;

    Als Ergebnis will ich halt in $week_for_filename folgenden Inhalt: 20071018

    Auch das muss doch schöner gehen oder nicht?


    1. / ↩︎

    2. 0-9 ↩︎

    1. Hab sogar noch was hässlicheres zusammen gebastelt:

      Ganz schön umständlich. Kürzer wäre

      my $week = "18/10/2007";  
      my $parts = join '', reverse (split '/', $week);
      

      Siechfred

      --
      Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
      1. Auch dir danke!
        Ich sag ja selbst, dass es extrem umständlich war. ;-)

  2. Hallo Masipulami!

    Ich habe als Ausgangsbasis folgenden String:
    for200711281234567890123456789.xml

    Nun muss ich aus diesem String ein mal das Datum extrahieren (...20071128...) und dann noch mal die 19-stellige Zahl danach.
    Momentan hab ich das so gelöst:

    Ich würde hier mit substr() arbeiten.

    Masipulami

    Viele Grüße aus Frankfurt/Main,
    Patrick

    --

    _ - jenseits vom delirium - _
    [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
    Nichts ist unmöglich? Doch!
    Heute schon gegökt?
    1. Vielen Dank für die schnell Hilfe.
      Hab vor lauter Wald die Bäume nicht mehr gesehen.
      Auf substr() bin ich gar nicht gekommen.

      Habs jetzt so gelöst:

      get week data from $FileApplic

      my $week_curr = substr($FileApplic, 3, 8);

      get timestamp from $FileApplic

      my $ts_curr = substr($FileApplic, 11, 19);

      So ists schön sauber! :-)

      Mein zweites Problem hab ich so gelöst:
      my $week_for_filename = substr($week, 6, 4) . substr($week, 3, 2). substr($week, 0, 2);

      Danke noch mal!

  3. Moinsen!

    Wie wäre es mit

    my $string = "for200711281234567890123456789.xml";

    $string =~ /(\d{8})(\d{19})/;
    my $week_curr = $1;
    my $ts_curr = $2;

    eventuell mit verfeinertem regulären Ausdruck, um bei anderem Inhalt des Strings garantiert die richtigen Bestandteile zu erwischen?

    Norbert

    1. Der Ansatz gefällt mir auch gut!
      Auch dir danke! Echt klasse wie schnell man hier Hilfe bekommt!

  4. So funktioniert es auch, aber ist es nicht möglich jeweils die 3 Zeilen für die RegEx in eine RegEx zusammen zu fassen?

    Klar, wozu gibt es Klammern:

    my $string = 'for200711281234567890123456789.xml';  
    $string =~ /^\w+?(\d{8})(\d+?\.)/;  
    my $date = $1;  
    my $whatever = $2;
    

    Das Feintuning überlasse ich Dir :)

    Siechfred

    --
    Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.