2016-10-22 67 views
0

我試圖在Java中使用正則表達式在字符串中查找時間。這裏的正則表達式:在Java中使用正則表達式查找12小時格式的時間

\d{1,2}?:\d\d(?)(am|pm)?? 

應該尋找1位或2位,後跟一個冒號,兩個數字,然後要麼「是」或「PM」(大小寫無關)。

它主要工作,但如果我在捕獲組中包裝整個正則表達式,我只會得到hh:mm。例如,「12:34 am」只返回「12:34」。沒有「是」。

UPDATE:完整的代碼示例

Pattern p = Pattern.compile("\\d{1,2}?:\\d\\d(?)(am|pm)??"); 
Matcher matcher = p.matcher("12:34AM"); 
Assert.assertTrue(matcher.find()); 
Assert.assertEquals("12:34AM", matcher.group()); 

任何人有任何想法,爲什麼?

+1

您正在尋找在錯誤的組。嘗試組0.下次,請發佈[mcve],而不僅僅是您認爲相關的位。猜你在做什麼不是最佳 – Tibrogargan

+1

爲什麼有這麼多的問號?我是否錯過了某些東西,或者這應該是'\ d {1,2}?:\ d \ d(am | pm)',或者am/pm是可選的\ d {1,2}:\ d \ d(am | pm)?' – 3ocene

+0

@ 3ocene我不認爲這是一個有效的正則表達式,因爲它是無論如何。什麼是「(?)」? – Tibrogargan

回答

2

而非目前的模式,你可能需要使用\b(?:[01]?\d|2[0-3]):[0-5]?\d(?:[ap]m)?\b匹配次,不區分大小寫的標誌設置,甚至使用24小時符號和12h符號之間的替代品,以不同與am/pm

當前模式使用一個懶惰的可選模式來匹配am/pm(am|pm)??),因爲它位於模式的末尾,它永遠不會匹配(除非在.matches()而不是.find()的上下文中使用) ,因爲它強制完全匹配)。

我真的不知道你的模式中的(?)

+0

我認爲這可能實際上是這樣做的,或多或少我嘗試了正則表達式並且未能找到匹配,但是如果我使用'(?:[01]?\\ d | 2 [0-3]):[0-5]?\\ d *(?: am | AM | pm | PM)?' 。我不是AM/PM處理最後的忠實粉絲,但我確實已經捕獲了這個問題,這是我的首要關注點,所以我可以在時間允許的情況下優化它。 – jasondlee

+0

是的,你不得不使用雙反斜槓來實際使用,但是當你在你的問題中用標準符號來寫你的正則表達式模式時,我認爲它會很好用。 –

-1

對不起我編輯:\d?\d:\d?\d["a"|"p"|"A"|"P"]["m"|"M"]

+0

這似乎並不真正回答原來的問題。是的,它可能會匹配一次,但它也會匹配很多其他的東西,比如'1234567890:0987654321 |'' – 3ocene

1

這與修改測試字符串匹配的情況下,刪除多餘的問號,並添加周圍組得到正確的組。

Pattern p = Pattern.compile("(\\d{1,2}:\\d\\d(AM|PM)?)"); 
Matcher matcher = p.matcher("12:34AM"); 
Assert.assertTrue(matcher.find()); 
Assert.assertEquals("12:34AM", matcher.group()); 
1

當你正在對12種小時格式匹配所以有很多束縛覆蓋所以從不使用\d,因爲它會接受用戶發出的任何數量的號碼輸入你的正則表達式將無法針對這些無效的情況下,像13:32am22:23am或許多其他非-12小時格式

所以,使其健壯使用

\\b(1[012]|0[1-9]):([0-5][0-9])(\\s)?([Aa]|[pP])[mM]

\\b(1[012]|0?[1-9]):\\b字邊界然後要麼10,11,12或從00-59

(\\s)?01-9

:([0-5][0-9]):字符匹配的數字可以有一個單一的空間

([Aa]|[pP])[mM]要麼是,上午或下午,PM等

完整的代碼將是

Pattern pattern=Pattern.compile("\\b(1[012]|0[1-9]):([0-5][0-9])(\\s)?([Aa]|[pP])[mM]"); 
    Matcher matcher=pattern.matcher("12:23am 12:6am ds 13:32am dwdw c 01:12am ded 1:21am"); 

    while (matcher.find()) { 
     System.out.println(matcher.group()); 
    } 

爲了讓更多的輸入,比如1:21am1:1am使用靈活

\\b(1[012]|0?[1-9]):([0-5]?[0-9])(\\s)?([Aa]|[pP])[mM]