[英]Finding 12-hour format Time in a String with Regex in Java
我正在嘗試使用Java中的正則表達式在字符串中查找時間。 這是正則表達式:
\d{1,2}?:\d\d(?)(am|pm)??
它應該尋找1或2位數字,然后是冒號,再輸入兩位數,然后是“ am”或“ pm”(與大小寫無關)。
它通常可以工作,但是如果我將整個正則表達式包裝在捕獲組中,則只會得到hh:mm。 例如,“ 12:34 am”僅返回“ 12:34”。 沒有“上午”。
更新:完整代碼示例
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());
有人知道為什么嗎?
您可能要使用\\b(?:[01]?\\d|2[0-3]):[0-5]?\\d(?:[ap]m)?\\b
,而不是當前的模式匹配時間,設置不區分大小寫的標志,甚至使用替代方法來區分am
/ pm
24小時表示法和12小時表示法
您當前的模式使用一個懶惰的可選模式來匹配am
/ pm
( (am|pm)??
),因為它位於模式的末尾,它將永遠不會匹配(除非在.matches()上下文中使用)而不是.find(),因為它會強制進行完全匹配)。
老實說,我不確定您的模式中的(?)
。
這樣可以正確修改測試字符串以匹配大小寫,刪除無關的問號並添加周圍的組,從而使您的組正確。
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());
由於您要匹配12小時格式,因此有很多內容需要覆蓋,因此請不要使用\\d
因為它將接受用戶提供的任何數字輸入,並且您的正則表達式將無法處理這些無效情況,例如13:32am
22: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
或0
帶1-9
:([0-5][0-9])
:
字符匹配的數字,從00-59
(\\\\s)?
可以有一個空格
([Aa]|[pP])[mM]
上午,上午或下午,下午等
完整的代碼將是
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:21am
和1:1am
這樣的輸入
抱歉,我編輯了以下內容: \\d?\\d:\\d?\\d["a"|"p"|"A"|"P"]["m"|"M"]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.