簡體   English   中英

使用Java中的Regex在字符串中查找12小時格式的時間

[英]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,1201-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:21am1:1am這樣的輸入

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

抱歉,我編輯了以下內容: \\d?\\d:\\d?\\d["a"|"p"|"A"|"P"]["m"|"M"]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM