Thread Regex für Timestamp matcht nicht so wie gewünscht (25 answers)
Opened by GwenDragon at 2024-02-01 12:07

GwenDragon
 2024-02-01 12:07
#195803 #195803
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Ich hadere gerade mit einem Regex. Und habe das Buch "Mastering Regular Expressions" von Jerry Friedl nicht zur Verfügung zum Spicken. ;-) Außerdem hätte ich gern von euch erklärt, wo mein Denkfehler beim Interpretieren der PCRE-Maschine liegt.

Es soll folgende Beispiele matchen:
+12345.777
!1234
aber nicht
+123A1234.11
!12X1234.987

Als Prüfung, ob der Timestamp aus CORE::time oder einer von Time::HiRes::time ist.

Warum fängt das Regex /^(\D)?(\d+(\.\d+)?)/ nur einen Teil?
Ich will ja $1 und $2 haben, also aus der ersten und zweiten umschließenden Klammer.
Ich versteh das Regex so
Code: (dl )
1
2
3
4
5
6
7
8
^     # Zeilenanfang
(\D)? # keine Ziffer, wenn vorhanden
(
\d+ # Mehrere Ziffern
(
\.\d+ # gefolgt von Punkt und Ziffern
)? # wenn vorhanden
)


Verwende ich /^(\D)?(\d+(\.\d+)?)$/ passt es.

Warum nur, wenn das Zeilenende mit im Regex ist?

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl

use strict; use warnings; use 5.024;

while (my $id = <DATA>) {
        if ($id =~ /^(\D)?(\d+(\.\d+)?)/ ) { # neues Format, falls Timestamp aus Time::HiRes    
                my ( $flag, $i ) = ($1, $2);
                say "$flag|$i" ;        
        }
}
__DATA__
IDS follow now:

+1123311.11
!1A23311
-1A23311-11
-123311.2211
!123311A
!123311

__END__


Ergibt:

+|1123311.11
!|1
-|1
-|123311.2211
!|123311
!|123311
Last edited: 2024-02-01 12:18:16 +0100 (CET)

View full thread Regex für Timestamp matcht nicht so wie gewünscht