Вы можете использовать это регулярное выражение и извлекать часы и / или минуты из соответствующей подходящей группы.
^(?=.)(?:(?<hours>\d+) *hours?)?(?: *(?<minutes>\d+) *minutes?)?$
Хотя я назвал группы, чтобы сделать их более доступными, но это не такЭто действительно необходимо.Даже без именованных групп group1 всегда будет регистрировать часы, а group2 - минуты, независимо от того, что содержат ваши данные, будь то часы или только минуты или оба.
Демо
Также ознакомьтесь с этим кодом Java.
List<String> list = Arrays.asList("1 hour","2 hours","1 hour 20 minutes","3 hours 30 minutes","3 hours 1 minute","1 hour 1 minute","1 minute","10 minutes");
Pattern p = Pattern.compile("^(?=.)(?:(?<hours>\\d+) *hours?)?(?: *(?<minutes>\\d+) *minutes?)?$");
list.stream().forEach(x -> {
Matcher m = p.matcher(x);
if (m.matches()) {
System.out.println(x + " ----> Hours: " + m.group("hours") + ", Minutes: " + m.group("minutes"));
} else {
System.out.println(x + " ----> Didn't match");
}
});
Prints,
1 hour ----> Hours: 1, Minutes: null
2 hours ----> Hours: 2, Minutes: null
1 hour 20 minutes ----> Hours: 1, Minutes: 20
3 hours 30 minutes ----> Hours: 3, Minutes: 30
3 hours 1 minute ----> Hours: 3, Minutes: 1
1 hour 1 minute ----> Hours: 1, Minutes: 1
1 minute ----> Hours: null, Minutes: 1
10 minutes ----> Hours: null, Minutes: 10