2016-03-24 19 views
0

Also versuche ich, alle Übereinstimmungen für eine Regex in Perl zu bekommen, aber die Ausgabe ist mit seltsamen Werten gemischt? Das ist mein Perl-Code:seltsame Ausgabe von Regex in Perl

#!/usr/bin/env perl 

use strict; 
use warnings; 
my $filename="test.txt"; 

my $data; 
open($data,$filename) or die "couldn't open the file"; 
while(<$data>) 
{ 
chomp($_); 


my @count = ($_ =~ /(((\d){1,4}(\s|\-|\.|\/)){1,3}(\d){2,4})/g); 

print @count; 

print "\n"; 
} 

Und der Inhalt meiner Textdatei ist wie folgt:

content 10-12-2015 
content 10 12 2015 
content 10-12-2015 
content 10/12/2015 
content 10.12.2015 
content 10.12.15 
content 10.12.1412 
content 1992.12.30 
content 22/04/96 
content 1996-04-22 
content 22.04.96 
content 10.12.1412 
content 1992.12.30 
content 22/04/96 
content 04/22/96 

der wirklich seltsam Ausgang ist immer sind das angepasste regex und andere Werte? im Array.

10-12-201512-2-5 
10 12 201512 2 5 
10-12-201512-2-5 
10/12/201512/2/5 
10.12.201512.2.5 
10.12.1512.2.5 
10.12.141212.2.2 
1992.12.3012.2.0 
22/04/9604/4/6 
1996-04-2204-4-2 
22.04.9604.4.6 
10.12.141212.2.2 
1992.12.3012.2.0 
22/04/9604/4/6 
04/22/9622/2/6 

Ein Beispiel für eine normale Ausgabe wäre: 2015.10.12 aber woher dieser Wert kam aus 12-2-5? Das Problem ist, dass ich in meiner anderen Textdatei mehr als ein Datum in einer Zeile habe, was bedeutet, dass ich nicht nur die erste Übereinstimmung aus dem Array bekommen kann.

pls helfen. . . . ! bin neu bei Perl und das bringt mich um!

+0

sehen Sie diese [IDEONE Demo] (http://ideone.com/ZOfyWR). Sie quantifizieren eine Erfassungsgruppe (1) und Sie platzieren eine Erfassungsgruppe auf ein einzelnes Zeichenmuster und quantifizieren es dann (2). –

Antwort

2

Woher kommt dieser Wert von 12-2-5?

Da Sie verschachtelte Erfassung Gruppen verwenden Es ist die Erfassung einzelner Teile.

Von 10-12-2015 es der Erfassung 12-2-5, die in ihrem Ergebnis nach vollständiger Erfassung von 10-12-2015 widerspiegeln. Gleiches gilt für jede Instanz.

Um nur Daten zu extrahieren, können Sie diese Regex verwenden.

Regex:(?:\d{2}|\d{4})[-\/\.\s]\d{2}[-\/\.\s](?:\d{4}|\d{2})

Diese Regex verwendet nicht einfangenden Gruppen.

Regex101 Demo

+0

meine Regex funktioniert gut mit den Daten, da ich auch verschiedene Datumsformate und verschiedene Regex haben. Mein Problem relais on Perl und der Ausgang bekomme ich, wenn ich diese Regex verwende. Auch habe ich diesen Regex mit einer ähnlichen Website getestet und ich habe die erwarteten Übereinstimmungen. –

+0

http://regexr.com/3d37n –

+0

@FahadAlkamli: Ich habe hinzugefügt, was mit Ihrer Regex geschah und fügte auch eine Lösung hinzu, die keine einfangenden Gruppen verwendet. –

0

Sie sollten nicht so viel Gruppierung mit Ihrem regulären Ausdruck verwenden, wenn Sie in den Werten nicht interessiert sind.

Jede Öffnung ( trägt einen Wert in die Ergebnisliste ein.

Sie könnten die folgenden leicht verwenden resexp die Gruppierungen zu minimieren und nur mit zwei Werten pro Spiel zu tun haben:

$_ =~ /((\d{1,4}[\s.\\-]){1,3}\d{2,4})/g 
+1

Yeah scheint wie ich versuchte, klug zu sein, aber stattdessen war ich dumm, Danke Mann! –

1

Wahrscheinlich zu spät, aber noobs regex Capture-Gruppe Ihr Code wie dieses

aussehen könnte
#!/usr/bin/env perl 

use strict; 
use warnings; 
my $filename="file.txt"; 

my $data; 
open($data,$filename) or die "couldn't open the file"; 
while (my $line = <$data>){ 
    chomp($line); 
    my (@count) = $line =~ /((?:\d{2}|\d{4})[-\/\.\s]\d{2}[-\/\.\s](?:\d{4}|\d{2}))/g; 

    print join(" : ", @count); 

    print "\n"; 
} 

Ausgang

10-12-2015 
10 12 2015 : 10.12.2015 : 11-23-2014 
10-12-2015 
10/12/2015 
10.12.2015 
10.12.15 
10.12.1412 : 10.12.1412 
1992.12.30 
22/04/96 
1996-04-22 
22.04.96 
10.12.1412 
1992.12.30 : 10.12.2015 
22/04/96 
04/22/96 
+0

Tatsächlich hat mir dein Code geholfen, ein anderes Problem zu lösen! also nichts ist zu spät! Danke, Mann –