[英]How to create a time matching Regex pattern
我一直在寫一個java程序。 在程序中,我正在接受用戶的輸入,這是一個時間。 我將輸入作為字符串並檢查它是否與模式匹配。 我想要的格式是格式:上午10:15
這是我嘗試但它似乎不起作用。
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;
}
}
謝謝。
只需停在那里。 Java已經有一種機制來解析包含日期/時間值的字符串。
它是好的學習正則表達式,但不使用它們已存在於框架的東西。 與SimpleDateFormat已經為您做的相比,您的解決方案總是有缺陷的!
你的正則表達式只允許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]
匹配0
到12
小時, [0-5][0-9]
匹配0
到59
分鍾, \\\\s*
匹配零個或多個空格, [Aa][Mm]
匹配Am
, AM
, aM
或者am
,如果一個領先的0
是必需的,去掉?
從之后[0-1]
請參閱Java演示
你為什么用^
? 沒有用。 一個Exponent用於在字符串開頭處斷言位置,但我沒有看到任何使用它來匹配時間。
數字為1
或2
位數。 \\d{1}
表示只有一個數字。 您應該使用\\d{1,2}
來表示一個或兩個最大數字。
沒有必要按{1}
跟隨[A]
。 它本身意味着只有一個角色而且是A
如果你想添加對PM
支持,那么你可以使用[AP]
然后只需[M]
或簡單地使用M
您可以使用此RegEx
\d{1,2}:\d{1,2}\s[AP][M]
轉義格式為:
\\d{1,2}:\\d{1,2}\\s[AP][M]
在使用正則表達式時,有些事情未被您正確理解
1.)^是正則表達式的保留字符,因此在使用它時必須將其轉義。 雖然它在這里使用不正確,但仍然如果你想工作,使用反斜杠()來逃避它。
所以表達式(雖然仍是不正確 ,但應該是這樣的)
\\d{1}:\\d{1}\^[A]{1}[M]{1} <- Watch carefully \^
2.) @ GhostCat建議是正確的,在這里使用SimpleDateFormat。
3.)如果您仍然希望繼續使用正則表達式,它應該看起來與模式匹配。
\\d{2}:\\d{2}\\s+(AM|PM)
現在逐一了解正則表達式
\\\\ d {2} - >這說兩位數
: - >這表示兩位數之后的冒號
\\\\ d {2} - >這說兩個數字正好在冒號之后
\\\\ s + - >這說不匹配。 在XX:XX之后的空格字符,你可以跳過它,因為它只是為了讓你的正則表達式更強大。
(AM | PM) - >這是一個捕獲組,並表示匹配AM OR(|)PM和其他任何內容。
你應該先測試你的正則表達式,試試http://rubular.com/
\d{2}[:]\d{2}\s*[A][M] //should work, this is the general regex
不要把^,在中間,這意味着字符串的開頭,($表示結束檢查rubular.com屏幕底部的指南
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.