2016-04-02 14 views
2

Bir giriş dizesinin geçerli bir 24 saatlik tarih biçiminde olup olmadığını belirlemeye çalışıyorum (örn. Ss: dd: ss). Birkaç farklı mantık kullanıyorum ve çoğunlukla test durumumla başarılı oldum. Kodum şu anda denediğim tüm girdiler için başarısız oluyor (aşağıda olanlar dahil).Girdi dizgisinin Java'da normal ifadeleri kullanarak saat zamanıyla eşleşip eşleşmediğini belirleyin.

sentezleme şu şekilde işler beklenir:

  • 11:24:10 çıktılayacaktır Valid form
  • girilmesi 00:13:42 çıktılayacaktır Valid form
  • giren 24:52:25 çıktılayacaktır Invalid form
  • girilmesi girilmesi 05:62:55 çıktılayacaktır Invalid form

İşte benim kod:

import java.util.Scanner; 

public class Main { 

    public static void main(String[] args) { 
     System.out.print("String to check: "); 
     String input = new Scanner(System.in).nextLine(); 

     if (input.matches("((0|1)[0-9])|(2[0-3]):[0-5][0-9]:[0-5][0-9]")) { 
     System.out.println("Valid form"); 
     } else { 
     System.out.println("Invalid form"); 
     } 
    } 
} 

Ben sadece son zamanlarda Java öğrenmeye başladım ve daha önce bu soru istendi özür dilerim (I googled!). Yardım ettiğin için teşekkür ederim!

+0

Sorunuzda biraz daha spesifik olabilir misiniz? Bu kod nasıl başarısız oluyor (ör. Hangi test senaryolarında)? Hangi test vakalarında başarılı oluyor? – Josephus

+0

@Alex Denediğim tüm girdiler için geçersiz form döndürür. – Vishal

+0

Sorunuz gerçekten Regex ile ilgili ise, o zaman bazı iyi cevaplarınız var. Sorunuz gerçekten gün-zaman değerlerini doğrulamakla ilgiliyse, Regex yerine ['LocalTime'] kullanmanızı öneririz (http://docs.oracle.com/javase/8/docs/api/java/time/ Java.time çerçevesi içinde Java 8 ve üstü (Java 6 & 7 ve Android için arka bağlantı noktaları ile) yerleşik LocalDate.html) sınıfı. –

cevap

1

It maç olacak senin regex

((0|1)[0-9])|(2[0-3]):[0-5][0-9]:[0-5][0-9] 

göre

(((0|1)[0-9])|(2[0-3])):[0-5][0-9]:[0-5][0-9] 

olmalıdır ((0|1)[0-9]) veya (2[0-3]):[0-5][0-9]:[0-5][0-9]

sadece

olarak eşleştirmek istiyorsanız

Ayrıca non capturing grubunu kullanabilirsiniz

(?:(?:(?:0|1)[0-9])|(?:2[0-3])):[0-5][0-9]:[0-5][0-9] 

Kişisel regex saat part

[01][0-9] 

IDEONE DEMO

DÜZENLEME

Biraz değişiklik

(?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9] 

değiştirerek daha ileri olarak basitleştirilmiş olabilir REGEX DEMO

+0

'Yakalama 'nasıl uygulamaya çalıştığımdan farklı? – Vishal

+0

@ Vishal 'olmayan yakalama 'grupları verileri yakalamaz (köşeli parantez içinde)()'). Eğer bir dizginin normal ifadeyle eşleşip eşleşmediğini kontrol etmek isterseniz, saat, dakika ve 'saniye 'ayrı ayrı sonra' 'yakalama grupları' ' – rock321987

+0

@Vishal kullanmalısınız Kodunuza göre, sadece doğru biçimde olsun ya da olmasın verileri eşleştirmeye çalışıyor gibi görünüyor. Bu yüzden, 'yakalamayan grup' – rock321987

1

sorunu mevcut regex (0|1)[0-9]) veya (2[0-3]):[0-5][0-9]:[0-5][0-9] maç olacak olmasıdır. || operatörünüzün (0|1)[0-9]) ve (2[0-3]) üzerinde çalışmasını istiyorsunuz. Eğer Scanner kapatmayın çünkü Ayrıca kaynak sızıntısı var

((0|1)[0-9])|(2[0-3]):[0-5][0-9]:[0-5][0-9] 

: Peki istediğiniz budur. Yeni Scanner'u bir değişkende saklamak daha iyidir, böylece daha sonra kapatabilirsiniz.İşte tam kod:

import java.util.Scanner; 

public class Main { 

    public static void main(String[] args) { 
     System.out.print("String to check: "); 
     Scanner sc = new Scanner(System.in); 
     String input = sc.nextLine(); 

     if (input.matches("(((0|1)[0-9])|(2[0-3])):[0-5][0-9]:[0-5][0-9]")) { 
      System.out.println("Valid form"); 
     } else { 
      System.out.println("Invalid form"); 
     } 

     sc.close(); 
    } 
} 
+0

Çöp toplayıcısının dikkatini çektiğini düşündüm Tarayıcı nesnelerinin Bundan sonra kapattığımdan emin olacağım. Teşekkürler! – Vishal

İlgili konular