您可以使用正则表达式 .*?(\d{1,2}:\d{1,2}(?:\:\d{1,2}(?:\.\d{1,9})?)?).* 匹配整个字符串,并将其替换为 group#1 匹配的模式。
regex的描述:
-
.*? :匹配(惰性)任意字符任意次数
-
(: 开始捕获组#1
-
\d{1,2}:\d{1,2} :一到两位数,后跟一到两位数
-
(?: :可选非捕获组的开始
-
\:\d{1,2} : : 后跟一到两位数(秒)
-
(?: :可选非捕获组的开始
-
\.\d{1,9} : . 后跟一到九位数字(纳秒)
-
)? : 关闭可选非捕获组
-
)? : 关闭可选非捕获组
-
):关闭捕获组#1
-
.*: 匹配任意字符任意次数
演示:
public class Main {
public static void main(String[] args) {
// Test strings
String[] wholeStringArr = { "The time is 7:00.", "The time is 7:00:05.", "The time is 7:00:05.1.",
"The time is 7:00:05.123.", "The time is 7:00:05.123456789." };
for (String wholeString : wholeStringArr) {
String timeOnlyString = wholeString.replaceAll(".*?(\\d{1,2}:\\d{1,2}(?:\\:\\d{1,2}(?:\\.\\d{1,9})?)?).*",
"$1");
System.out.println(timeOnlyString);
}
}
}
输出:
7:00
7:00:05
7:00:05.1
7:00:05.123
7:00:05.123456789
ONLINE DEMO
java.time
java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用,改用modern Date-Time API*。
使用现代日期时间 API java.time 的解决方案:
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
String wholeString = "The time is 7:00.";
String timeOnlyString = wholeString.replaceAll(".*?(\\d{1,2}:\\d{1,2}(?:\\:\\d{1,2}(?:\\.\\d{1,9})?)?).*",
"$1");
DateTimeFormatter dtf = DateTimeFormatter
.ofPattern("H:m[:s[.[SSSSSSSSS][SSSSSSSS][SSSSSSS][SSSSSS][SSSSS][SSSS][SSS][SS][S]", Locale.ENGLISH);
LocalTime time = LocalTime.parse(timeOnlyString, dtf);
System.out.println(time);
}
}
输出:
07:00
ONLINE DEMO
注意方括号中的可选模式。
通过 Trail: Date Time 了解有关 modern Date-Time API* 的更多信息。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。