2016-07-01 2 views
-1

Ich habe ein Programm, das Information für einen Zeitstempel erzeugt, hat der Zeitstempel das folgende Format entsprechen: MM/DD/YYYY HH:MM:SS AM or PMRegex zu mm/tt/hh entsprechen: mm: ss AM oder PM

Zum Beispiel:

06/02/2016 10:14:56 AM

09/14/2014 9:16:32 PM

ich brauche einen Weg, um diese Informationen entsprechen bevorzugt einen regulären Ausdruck verwenden, aber es ist nicht ein regulärer Ausdruck sein muss. Jede Hilfe mit diesem würde sehr geschätzt werden.

Ich weiß, wie die Ziffern /\d+/ und nicht Leerzeichen übereinstimmen, aber die Zahlen übereinstimmen, werden die :, /, AM or PM nicht greifen. Und wenn man den nicht-weißen Raum ergreift, wird alles außer dem offensichtlich weißen Raum packen.

So zu rekapitulieren brauche ich einen Weg, um zu überprüfen, dass eine formatierte Zeit und Datum: MM/DD/YYYY HH:MM:SS AM or PM Das kann 20 bis 22 Zeichen (einschließlich Leerraum) existiert oder nicht als Benutzereingabe gegeben.

Beispiel von dem, was ich brauche:

def timestamp 
    print 'Enter the time stamp to verify: ' 
    ts = gets.chomp 
    if !(ts[REGEX-HERE]) 
    puts 'Invalid formatting of time stamp' 
    exit 1 
    else 
    puts ts 
    end 
end 

# <= 6/1/2016 1:10:5 PM will output '6/1/2016 1:10:5 PM' 
# <= 06/01/2016 01:10:05 PM will output 'Invalid formatting of time stamp' 
# <= 10/1/2016 1:25:43 AM will output '10/1/2016 1:25:43 AM' 
# <= 10/01/2016 01:25:43 AM will output 'Invalid formatting of time stamp' 
+0

Ich sehe. Sie möchten entweder 14.09.2014 9:16:32 PM oder 09/14/2014 9:16:32 AM – zee

+0

übereinstimmen Ich möchte einen formatierten Zeitstempel zuordnen, der zwischen 16 und 20 Zeichen (einschließlich Leerzeichen) enthalten kann Beispiele dafür, wie diese Zeitstempel aussehen, sind '10/22/2016 9:15:32 PM' oder' 9/9/2016 9: 9: 5 PM' Sie haben nicht die Nummer 0 vor ihnen, wenn sie unten ist 12 Uhr – JohnDoeYo

+1

Sie müssen Ihre Versuche zeigen, den regulären Ausdruck zu erzeugen, anstatt uns zu bitten, sie für Sie zu schreiben. Reguläre Ausdrücke sind gut dokumentiert, einschließlich in Rubys Regexp-Klasse. Daher sollte das Schreiben eines Musters leicht erforscht und herausgefunden werden. http://meta.stackoverflow.com/q/261592/128421 –

Antwort

2

Diese Regex für Sie sollten für die Validierung Ihrer Eingaben arbeiten:

^\d{1,2}\/\d{1,2}\/\d{4} \d{1,2}:\d{1,2}:\d{1,2} [AP]M\z 

RegEx Demo

Dies wird entweder dieser Eingänge Linien bestätigen:

10/22/2016 9:15:32 PM 
9/9/2016 9:9:5 AM 
+1

Das ist perfekt, danke – JohnDoeYo

+1

Genau richtig, danke! – JohnDoeYo

+1

Könnte geschworen haben, dass ich das schon getan habe! Mein Fehler! – JohnDoeYo

2

Charaktere wie / und : und sogar Buchstaben können litterally hinzugefügt werden. Versuchen Sie folgendes:

/[01][0-9]/[0-3][0-9]/[0-9]{4} [0-2]?[0-9]:[0-6]?[0-9]:[0-6]?[0-9] (AM|PM)/ 
1

Versuche dies . Ich hoffe ich habe deine Frage verstanden. Getestet hier http://rubular.com/ und es funktioniert.

^(\d{1,2}\/){2}\d{4}\s+((\d+)(\:)){2}\d+\s+(AM|PM) 

enter image description here

3

Ich glaube nicht ein regulärer Ausdruck ist das richtige Werkzeug für diesen Job ist. Ich würde DateTime.strptime verwenden, geben Sie es das Format, das Sie erwarten, und lassen Sie es mit all den "50 Stunden ist ungültig in einer Tageszeit", "09 im Vergleich zu 9", ... Probleme.

Etwas wie:

require 'date' 

def timestamp 
    print 'Enter the time stamp to verify: ' 
    ts = gets.chomp # You might want to include a String#strip call in here too 
    DateTime.strptime(ts, '%m/%d/%Y %I:%M:%S %p') 
    puts ts 
rescue ArgumentError 
    puts 'Invalid formatting of time stamp' 
    exit 1 
end 

Regexes schön sind, aber sie sollten das einzige Parsing-Tool haben Sie nicht sein.

1

Wie von mu is too short, Regex ist großartig und alle, aber Sie brauchen mehr in Ihrem Arsenal dann nur das.

def timestamp 
    print 'Enter time stamp: ' 
    ts = gets.chomp.upcase 
    verify = DateTime.strptime(ts, '%m/%d/%Y %I:%M:%S %p') 
    puts ts 
rescue ArgumentError 
    puts 'Invalid timestamp formatting must contain date time AM or PM' 
    timestamp 
end 

Natürlich könnte dies einen Überlauf aus dem Puffer verursachen, da es rekursiv ist, aber das Chance dafür ist ziemlich schlank.

Wenn dies auszuführen:

irb(main):01:0> def timestamp 
irb(main):02:1> print 'Enter time stamp: ' 
irb(main):02:1> ts = gets.chomp.upcase 
irb(main):04:1> verify = DateTime.strptime(ts, '%m/%d/%Y %I:%M:%S %p') 
irb(main):05:1> puts ts 
irb(main):06:1> rescue ArgumentError 
<valid timestamp formatting must contain date time AM or PM' 
irb(main):07:1> timestamp 
irb(main):08:1> end 
=> :timestamp 
irb(main):09:0> timestamp 
Enter time stamp: test 
Invalid timestamp formatting must contain date time AM or PM 
Enter time stamp: 06/30/2016 6:6:54 pm 
06/30/2016 6:6:54 PM 
=> nil 

Allerdings ist es möglich, dass Sie eine bessere Art und Weise der Überprüfung machen könnte:

def enter_stamp 
    print 'Enter timestamp: ' 
    ts = gets.chomp 
    verify_stamp(ts) 
end 

def verify_stamp(timestamp) 
    Date.strptime(timestamp, '%m/%d/%Y %I:%M:%S %p') 
    puts timestamp unless ArgumentError 
rescue ArgumentError 
    puts 'Invalid timestamp format' 
    enter_stamp 
end 

Das macht es so, dass die Methoden mehr OOPish sind und Ruby dreht sich alles um OOP, also funktioniert es irgendwie. Wenn dies ausgeführt wird:

irb(main):001:0> require 'date' 
=> true 
irb(main):002:0> 
irb(main):003:0* def enter_stamp 
irb(main):004:1> print 'Enter timestamp: ' 
irb(main):005:1> ts = gets.chomp 
irb(main):006:1> verify_stamp(ts) 
irb(main):007:1> end 
=> :enter_stamp 
irb(main):008:0> 
irb(main):009:0* def verify_stamp(timestamp) 
irb(main):010:1> Date.strptime(timestamp, '%m/%d/%Y %I:%M:%S %p') 
irb(main):011:1> puts timestamp unless ArgumentError 
irb(main):012:1> rescue ArgumentError 
irb(main):013:1> puts 'Invalid timestamp format' 
irb(main):014:1> enter_stamp 
irb(main):015:1> end 
=> :verify_stamp 
irb(main):016:0> enter_stamp 
Enter timestamp: test 
Invalid timestamp format 
Enter timestamp: 06/12/2016 8:08:54 pm 
=> nil 

Und natürlich können Sie auch nur einen regulären Ausdruck verwenden:

def verify_timestamp(stamp) 
    if !(stamp[/^\d{1,2}\/\d{1,2}\/\d{4} \d{1,2}:\d{1,2}:\d{1,2} [AP]M\z/]) 
    puts 'Invalid timestamp formatting' 
    timestamp 
    else 
    stamp 
    end 
end 

def timestamp 
    print 'Enter timestamp for removal: ' 
    ts = gets.chomp 
    verify_timestamp(ts) 
end 

Wie gesagt regexs sind wunderbar, sie sind einfach nicht genau das Beste, was alles zu verwenden, die Zeit .. Wenn dies ausgeführt wird:

irb(main):001:0> def verify_timestamp(stamp) 
<mp[/^\d{1,2}\/\d{1,2}\/\d{4} \d{1,2}:\d{1,2}:\d{1,2} [AP]M\z/]) 
irb(main):003:2>  puts 'Invalid timestamp formatting' 
irb(main):004:2>  timestamp 
irb(main):005:2> else 
irb(main):006:2*  stamp 
irb(main):007:2> end 
irb(main):008:1> end 
=> :verify_timestamp 
irb(main):009:0> 
irb(main):010:0* def timestamp 
irb(main):011:1> print 'Enter timestamp for removal: ' 
irb(main):012:1> ts = gets.chomp 
irb(main):013:1> verify_timestamp(ts) 
irb(main):014:1> end 
=> :timestamp 
irb(main):015:0> verify_timestamp(timestamp) 
Enter timestamp for removal: test 
Invalid timestamp formatting 
Enter timestamp for removal: 06/12/2016 8:18:54 pm 
=> "06/12/2016 8:18:54 pm" 
irb(main):016:0> 

So dort haben Sie es, gibt es drei verschiedene Möglichkeiten, um Ihre Zeitstempel, um zu überprüfen, je nachdem, was Sie sie verwenden möchten vielleicht eine andere Geschichte sein, aber jeder von ihnen drei Sh Ich könnte den Trick machen.

Verwandte Themen