2016-09-26 34 views
2

我一直在編寫一個java程序。在程序中,我正在從用戶那裏接受一個輸入。我把輸入作爲一個字符串,並檢查它是否匹配模式。我想要的格局是格式:10:15 AM如何創建時間匹配正則表達式

這是我試過的,但它似乎沒有工作。

public static boolean checkTimePattern(String time) { 
    Pattern pattern = Pattern.compile("\\d{1}:\\d{1}^[A]{1}[M]{1}"); 
    if(pattern.matcher(time).matches()){ 
     return true; 
    }else{ 
     return false; 
    } 
} 

謝謝。

+3

你應該使用SimpleDateFormat,而不是正則表達式 – Jens

+0

你想用你的正則表達式來檢查什麼? '\ d {1}'表示只有1個數字,'^ [A] {1}'表示一個'''然後一個'A'。所有這些都沒有意義,並且與您的首選格式不匹配 –

回答

5

簡單地停在那兒。 Java已經有一種機制來解析包含日期/時間值的字符串。

研究正則表達式很好,但是不是將它們用於框架中已經存在的東西。您的解決方案總是相比SimpleDateFormat已經爲您做的不足!

1
  1. 爲什麼使用^?沒有用處。指數用於斷言字符串的開始位置,但我沒有看到用這個來匹配時間。

  2. 這些數字是12數字。 \d{1}表示只有一個數字在那裏。您應該改用\d{1,2}表示一個或最多兩位數字。

  3. {1}沒有必要遵循[A]。它本身意味着只有一個字符,那就是A。如果你想添加對PM的支持,那麼你可以使用[AP],然後簡單地[M]或簡單地M

你可以使用這個表達式

\d{1,2}:\d{1,2}\s[AP][M] 

轉義格式是:

\\d{1,2}:\\d{1,2}\\s[AP][M] 

DEMO

+0

1.要字面匹配'^',如果它位於字符串的中間,則可以簡單地使用'^'而無需轉義。 2.在「正則表達式」的情況下,數字應該是'\ d'而不是'\\ d'(這是由Java字符串文字引起的轉義。你不需要'[''''最後一個'M' –

+0

@AdrianShum感謝您的通知,我已經相應地更新了我的答案。 –

-1

你應該首先測試你的正則表達式,嘗試http://rubular.com/

\d{2}[:]\d{2}\s*[A][M] //should work, this is the general regex 

不要把^,在表示字符串的開頭,中間,($意味着結束檢查在屏幕底部的指導方針,在rubular.com

+0

錯誤。中間的'^'的意思是'^'字面意思是 –

+0

opps我並不是指字面上的@adrian shum –

2

你的正則表達式只允許1小時的數字和1分鐘的數字,並且需要在A之前出現字符串的開始。這沒什麼意義。

驗證時間(或日期)的最佳方式,用SimpleDateFormat

String s = "10:15 AM"; 
SimpleDateFormat sdf = new SimpleDateFormat("hh:mm a"); 
sdf.setLenient(false); 
try { 
    Date dt2 = sdf.parse(s); 
    System.out.println(dt2); 
} 
catch (Exception exc) { 
    System.out.println(s + " IS NOT VALID TIME"); 
} 

如果你一定要使用正則表達式,使用

//Regex 
String pat = "[0-1]?[0-2]:[0-5][0-9]\\s*[Aa][Mm]"; 
if (s.matches(pat)){ 
    System.out.println("Regex matches the string!"); 
} 

(其中[0-1]?[0-2]比賽012小時, [0-5][0-9]匹配059分鐘,\\s*匹配零個或多個空格,[Aa][Mm]匹配AmAMaMam。如果需要領導0,從[0-1]後刪除?。)

Java demo

+0

如果在時間和AM之間必須有*一個空白*,請從'\'後面刪除'*' \ s'。 –

1

有幾個是不是由你,而你正在使用正則表達式

1理解正確的事情。 )^是正則表達式的保留字符,因此在使用它時必須將其轉義。雖然它在這裏使用不正確,但如果你想工作,使用反斜槓()將其轉義。

所以表達式(雖然還是不正確但應該是這樣的)

  \\d{1}:\\d{1}\^[A]{1}[M]{1}      <- Watch carefully \^ 

2)@GhostCat advice是正確的,使用的SimpleDateFormat這裏。

3.)如果你還想繼續使用正則表達式,它應該看起來這符合模式。

 \\d{2}:\\d{2}\\s+(AM|PM) 

瞭解由部分正則表達式的一部分現在

\\ d {2} - >這表示兩個數字恰好

- >這表示一個兩位數後的冒號

\\ d {2} - >這說明冒號後的兩個數字完全相同

\\ s + - >這說的匹配任何沒有。 XX:XX之後的空格字符,您可以跳過它,因爲它只是爲了讓您的正則表達式更加健壯。

(上午|下午) - >這是一個捕獲組,並表示匹配AM或(|)PM而不是別的。