使用java.time API 的解决方案:
我建议您使用java.time.Period,它以ISO-8601 standards 为蓝本,并作为JSR-310 implementation 的一部分与Java-8 一起引入。
演示:
import java.time.Period;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
String[] arr = { "1 years, 2 months, 22 days", "1 years, 1 months, 14 days", "4 years, 24 days",
"13 years, 21 days", "9 months, 1 day" };
List<Period> periodList =
Arrays.stream(arr)
.map(s -> Period.parse(
"P" + s.replaceAll("[\\s+,]", "")
.replaceAll("years?","Y")
.replaceAll("months?", "M")
.replaceAll("days?", "D")
)
)
.collect(Collectors.toList());
System.out.println(periodList);
// Now you can retrieve year, month and day from the Period e.g.
periodList.forEach(p ->
System.out.println(
p + " => " +
p.getYears() + " years " +
p.getMonths() + " months "+
p.getDays() +" days"
)
);
}
}
输出:
[P1Y2M22D, P1Y1M14D, P4Y24D, P13Y21D, P9M1D]
P1Y2M22D => 1 years 2 months 22 days
P1Y1M14D => 1 years 1 months 14 days
P4Y24D => 4 years 0 months 24 days
P13Y21D => 13 years 0 months 21 days
P9M1D => 0 years 9 months 1 days
ONLINE DEMO
通过 Trail: Date Time 了解有关 modern Date-Time API* 的更多信息。
使用 Java RegEx API 的解决方案:
另一种方法是使用Matcher#find。
演示:
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
String[] arr = { "1 years, 2 months, 22 days", "1 years, 1 months, 14 days", "4 years, 24 days",
"13 years, 21 days", "9 months, 1 day" };
int[] years = new int[arr.length];
int[] months = new int[arr.length];
int[] days = new int[arr.length];
Pattern yearPattern = Pattern.compile("\\d+(?= year(?:s)?)");
Pattern monthPattern = Pattern.compile("\\d+(?= month(?:s)?)");
Pattern dayPattern = Pattern.compile("\\d+(?= day(?:s)?)");
for (int i = 0; i < arr.length; i++) {
Matcher yearMatcher = yearPattern.matcher(arr[i]);
Matcher monthMatcher = monthPattern.matcher(arr[i]);
Matcher dayMatcher = dayPattern.matcher(arr[i]);
years[i] = yearMatcher.find() ? Integer.parseInt(yearMatcher.group()) : 0;
months[i] = monthMatcher.find() ? Integer.parseInt(monthMatcher.group()) : 0;
days[i] = dayMatcher.find() ? Integer.parseInt(dayMatcher.group()) : 0;
}
// Display
System.out.println(Arrays.toString(years));
System.out.println(Arrays.toString(months));
System.out.println(Arrays.toString(days));
}
}
输出:
[1, 1, 4, 13, 0]
[2, 1, 0, 0, 9]
[22, 14, 24, 21, 1]
ONLINE DEMO
正则表达式的解释:
-
\d+:一位或多位数字
-
(?=:前瞻断言模式的开始
-
year :空格字符后跟year
-
(?:s)? :可选字符,s
-
):前瞻断言模式结束
查看regex demo 以更深入地了解正则表达式。
* 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring。请注意,Android 8.0 Oreo 已经提供了support for java.time。